{"_id":"@marianmeres/fsm","_rev":"38-6a75dccee889f2b605e011fea89454e1","name":"@marianmeres/fsm","dist-tags":{"latest":"3.1.0"},"versions":{"2.0.0":{"name":"@marianmeres/fsm","version":"2.0.0","author":{"name":"Marian Meres"},"license":"MIT","_id":"@marianmeres/fsm@2.0.0","maintainers":[{"name":"marianmeres","email":"marian@meres.sk"}],"homepage":"https://github.com/marianmeres/fsm#readme","bugs":{"url":"https://github.com/marianmeres/fsm/issues"},"dist":{"shasum":"c4220ce9b515a86facd45fe8329b9b5101a793dd","tarball":"https://registry.npmjs.org/@marianmeres/fsm/-/fsm-2.0.0.tgz","fileCount":7,"integrity":"sha512-fAfU47tj/X4qiVxp12hS3ThBGoRYs1eMDhbqbP1qzwE20MickTh1qjqs+T2K12jIsxtaAKVAZlCWRmwuSj857w==","signatures":[{"sig":"MEUCIFZ1smGkIYJbb/tsRoNYcx34wA7X39TginVlKYp21X/oAiEA2wn63gjHmJjLh/U4et4d0BJ7ETvEhGivYVLLn3sFVA0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":13154},"main":"dist/mod.js","type":"module","types":"dist/mod.d.ts","gitHead":"84dd7c6ece87dc7a1ec3fb3320f2edc0d799c155","_npmUser":{"name":"marianmeres","email":"marian@meres.sk"},"repository":{"url":"git+https://github.com/marianmeres/fsm.git","type":"git"},"_npmVersion":"11.6.2","description":"A lightweight, typed, framework agnostic and synchronous finite state machine that acts as a pure state graph description.","directories":{},"_nodeVersion":"25.1.0","dependencies":{"@marianmeres/clog":"^2.3.3","@marianmeres/pubsub":"^2.2.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/fsm_2.0.0_1763743581310_0.7378227273233984","host":"s3://npm-registry-packages-npm-production"}},"2.0.1":{"name":"@marianmeres/fsm","version":"2.0.1","author":{"name":"Marian Meres"},"license":"MIT","_id":"@marianmeres/fsm@2.0.1","maintainers":[{"name":"marianmeres","email":"marian@meres.sk"}],"homepage":"https://github.com/marianmeres/fsm#readme","bugs":{"url":"https://github.com/marianmeres/fsm/issues"},"dist":{"shasum":"430784fd506dc5d902c65941ca3c7d96284489f5","tarball":"https://registry.npmjs.org/@marianmeres/fsm/-/fsm-2.0.1.tgz","fileCount":7,"integrity":"sha512-aEv7S61QD8eQYUHun/cMMhDigKsV0EWnV9sTjccWe/XOkAtdr7/wfePTdY6pK3+GRoYnofPv1SWmTAgW9O7uMA==","signatures":[{"sig":"MEQCID8fCaYL1h/xfzge58gYY/tuLT6yqDl2Bd+9uKa2oiy8AiBt+t6DJ0m9KXzm0aXd0XwDhbh4XHMiYPDzFjTfZ6gYdg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12844},"main":"dist/mod.js","type":"module","types":"dist/mod.d.ts","gitHead":"2c5f59b23b840f55167b4e39f359faa376a16e13","_npmUser":{"name":"marianmeres","email":"marian@meres.sk"},"repository":{"url":"git+https://github.com/marianmeres/fsm.git","type":"git"},"_npmVersion":"11.6.2","description":"A lightweight, typed, framework agnostic and synchronous finite state machine that acts as a pure state graph description.","directories":{},"_nodeVersion":"25.1.0","dependencies":{"@marianmeres/clog":"^2.3.3","@marianmeres/pubsub":"^2.2.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/fsm_2.0.1_1763791099027_0.5961127374092943","host":"s3://npm-registry-packages-npm-production"}},"2.2.0":{"name":"@marianmeres/fsm","version":"2.2.0","author":{"name":"Marian Meres"},"license":"MIT","_id":"@marianmeres/fsm@2.2.0","maintainers":[{"name":"marianmeres","email":"marian@meres.sk"}],"homepage":"https://github.com/marianmeres/fsm#readme","bugs":{"url":"https://github.com/marianmeres/fsm/issues"},"dist":{"shasum":"5a9f6fc1f8cace3ba0b28dce6d22db0087fb3b71","tarball":"https://registry.npmjs.org/@marianmeres/fsm/-/fsm-2.2.0.tgz","fileCount":7,"integrity":"sha512-ynjdqztla6zWBdEVhL6JmQTEQZKM76AqzRBgpw0Jt7WHzLmsuNjqTLHZ3LKK+eB5oalxmIAvZTMP9x7HCpsHxQ==","signatures":[{"sig":"MEQCIBV5VRqTqCfnAhmMCNPFuJXSHfodPStC6TbygtgOK69jAiA2LsC52D/QqXg02Hd1cz03LWjHIOXPVZ+fOQn5Ysc4Qg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":17456},"main":"dist/mod.js","type":"module","types":"dist/mod.d.ts","gitHead":"0d9bd27d32f98f7c0adce5b976fa2f98863ba5c3","_npmUser":{"name":"marianmeres","email":"marian@meres.sk"},"repository":{"url":"git+https://github.com/marianmeres/fsm.git","type":"git"},"_npmVersion":"11.6.2","description":"A lightweight, typed, framework agnostic and synchronous finite state machine that acts as a pure state graph description.","directories":{},"_nodeVersion":"25.1.0","dependencies":{"@marianmeres/clog":"^2.3.3","@marianmeres/pubsub":"^2.2.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/fsm_2.2.0_1763803686562_0.03991032386276383","host":"s3://npm-registry-packages-npm-production"}},"2.3.0":{"name":"@marianmeres/fsm","version":"2.3.0","author":{"name":"Marian Meres"},"license":"MIT","_id":"@marianmeres/fsm@2.3.0","maintainers":[{"name":"marianmeres","email":"marian@meres.sk"}],"homepage":"https://github.com/marianmeres/fsm#readme","bugs":{"url":"https://github.com/marianmeres/fsm/issues"},"dist":{"shasum":"78451e66bfe2c91596c6aa583a44c3e2d3343511","tarball":"https://registry.npmjs.org/@marianmeres/fsm/-/fsm-2.3.0.tgz","fileCount":7,"integrity":"sha512-/ZV+FlgeC6byFhhhVoSNoiVQzN3KckqVGuasD7cIhA7jjC0B+j0s/YSU5joPIY8QyY9nFKQpROyzU1/1NeJVfw==","signatures":[{"sig":"MEUCICkxKaXVexBml9pKnzStIKjao7k0L5GlzjNIzbk0XHCdAiEAg6inpm6rakClVthkf2NCOpy43Gn0rekD4spc/EIRKo8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":20632},"main":"dist/mod.js","type":"module","types":"dist/mod.d.ts","gitHead":"3cc58b7f0c2319c6b099b71d871ffe73d99a2296","_npmUser":{"name":"marianmeres","email":"marian@meres.sk"},"repository":{"url":"git+https://github.com/marianmeres/fsm.git","type":"git"},"_npmVersion":"11.6.2","description":"A lightweight, typed, framework agnostic and synchronous finite state machine that acts as a pure state graph description.","directories":{},"_nodeVersion":"25.2.1","dependencies":{"@marianmeres/clog":"^2.3.3","@marianmeres/pubsub":"^2.2.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/fsm_2.3.0_1764221843551_0.264562779036595","host":"s3://npm-registry-packages-npm-production"}},"2.4.0":{"name":"@marianmeres/fsm","version":"2.4.0","author":{"name":"Marian Meres"},"license":"MIT","_id":"@marianmeres/fsm@2.4.0","maintainers":[{"name":"marianmeres","email":"marian@meres.sk"}],"homepage":"https://github.com/marianmeres/fsm#readme","bugs":{"url":"https://github.com/marianmeres/fsm/issues"},"dist":{"shasum":"1fdf77c3c5f9e3349d4fbdf14d36f68b404a2a33","tarball":"https://registry.npmjs.org/@marianmeres/fsm/-/fsm-2.4.0.tgz","fileCount":7,"integrity":"sha512-qVLxYoHmQvhvivCdsvxoMj+Q0awd+G5IuffhOmbL+qxVcfLaG2kOG3xxi+fAk8mxoSvWNS8WBqhbeI6lITJWKQ==","signatures":[{"sig":"MEYCIQD+mYb1UIwCOIu5PtJQzrJhHU8oxAjb7K8886ozazh3xwIhALkcIrrpOCNKOhzdxIetRxjYzQP3bdVSz2GI2CvFf9/L","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":24618},"main":"dist/mod.js","type":"module","types":"dist/mod.d.ts","gitHead":"dbfe3cc2ef22b9b3e24e2f09d64845b08f56440c","_npmUser":{"name":"marianmeres","email":"marian@meres.sk"},"repository":{"url":"git+https://github.com/marianmeres/fsm.git","type":"git"},"_npmVersion":"11.6.2","description":"A lightweight, typed, framework agnostic and synchronous finite state machine that acts as a pure state graph description.","directories":{},"_nodeVersion":"25.2.1","dependencies":{"@marianmeres/clog":"^2.3.3","@marianmeres/pubsub":"^2.2.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/fsm_2.4.0_1764319436978_0.1503147629140813","host":"s3://npm-registry-packages-npm-production"}},"2.4.1":{"name":"@marianmeres/fsm","version":"2.4.1","author":{"name":"Marian Meres"},"license":"MIT","_id":"@marianmeres/fsm@2.4.1","maintainers":[{"name":"marianmeres","email":"marian@meres.sk"}],"homepage":"https://github.com/marianmeres/fsm#readme","bugs":{"url":"https://github.com/marianmeres/fsm/issues"},"dist":{"shasum":"5ec5ef0fd50e90746844eecb6df522be7d765a4c","tarball":"https://registry.npmjs.org/@marianmeres/fsm/-/fsm-2.4.1.tgz","fileCount":7,"integrity":"sha512-PmpHMb948yOFxF3j5pV1uNUj6epNEBXbX6LEuNhsNWla7VsbkdTEjWbyqtc1B24gSaEpBHfJy+xHwVZKXEAA4g==","signatures":[{"sig":"MEUCICBmHYjNmi9wR29CrliEdJShkrV4aMvCaLgLz7CGoMFWAiEAlz0cmT9E/wgsbCJuQZA1qpRgCDLYLKahyR/P9JilEO0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":23807},"main":"dist/mod.js","type":"module","types":"dist/mod.d.ts","gitHead":"7f404dd76daca595c9eb8d8c3e7dc62a77e1da6f","_npmUser":{"name":"marianmeres","email":"marian@meres.sk"},"repository":{"url":"git+https://github.com/marianmeres/fsm.git","type":"git"},"_npmVersion":"11.6.2","description":"A lightweight, typed, framework agnostic and synchronous finite state machine that acts as a pure state graph description.","directories":{},"_nodeVersion":"25.2.1","dependencies":{"@marianmeres/clog":"^2.3.3","@marianmeres/pubsub":"^2.2.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/fsm_2.4.1_1764320472378_0.2777970522800939","host":"s3://npm-registry-packages-npm-production"}},"2.5.0":{"name":"@marianmeres/fsm","version":"2.5.0","author":{"name":"Marian Meres"},"license":"MIT","_id":"@marianmeres/fsm@2.5.0","maintainers":[{"name":"marianmeres","email":"marian@meres.sk"}],"homepage":"https://github.com/marianmeres/fsm#readme","bugs":{"url":"https://github.com/marianmeres/fsm/issues"},"dist":{"shasum":"e99687ac3cc489db9c02e880b55714a5eddcf210","tarball":"https://registry.npmjs.org/@marianmeres/fsm/-/fsm-2.5.0.tgz","fileCount":9,"integrity":"sha512-FxX4ywkgBBQcmNVqVzkCW/v/BbMXjOOtQRYFK99zeoOp4aCyW9iA/CYugMMgKQmdz6q1XWsVOspMBbtatz8kHg==","signatures":[{"sig":"MEQCID5VVFcD2Jylgce01w3YORZxPieuvAXtLFNk9BRxHtPrAiBxV8EX0PfleC3ve3phRQh3fEkVxh+//obynvplY4KvWA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":30976},"main":"dist/mod.js","type":"module","types":"dist/mod.d.ts","gitHead":"fbad7e1e7d185b2e630cfde92b7705cd7b8afd00","_npmUser":{"name":"marianmeres","email":"marian@meres.sk"},"repository":{"url":"git+https://github.com/marianmeres/fsm.git","type":"git"},"_npmVersion":"11.6.2","description":"A lightweight, typed, framework agnostic and synchronous finite state machine that acts as a pure state graph description.","directories":{},"_nodeVersion":"25.2.1","dependencies":{"@marianmeres/clog":"^2.3.3","@marianmeres/pubsub":"^2.2.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/fsm_2.5.0_1764324286347_0.24964143765788704","host":"s3://npm-registry-packages-npm-production"}},"2.5.1":{"name":"@marianmeres/fsm","version":"2.5.1","author":{"name":"Marian Meres"},"license":"MIT","_id":"@marianmeres/fsm@2.5.1","maintainers":[{"name":"marianmeres","email":"marian@meres.sk"}],"homepage":"https://github.com/marianmeres/fsm#readme","bugs":{"url":"https://github.com/marianmeres/fsm/issues"},"dist":{"shasum":"0db6522da996f8585d060d9e78aac151e26eb21f","tarball":"https://registry.npmjs.org/@marianmeres/fsm/-/fsm-2.5.1.tgz","fileCount":9,"integrity":"sha512-k0YiK/ayx01EhaRhlLEjMFoiJ+h1dIJ4ktV5MKlY8QAudWgy4uSy3maTuN1w3fbPidXOB5kS7nSxvsAssQaasw==","signatures":[{"sig":"MEUCIQC0L/FhZg8zkL6xP56kNtkt4QD07IpipKMSNCDkTdKXZAIgcOMoMl7F4k9f9T0vLo+zTYnWucQm/rTzolu/qMMzD60=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":31648},"main":"dist/mod.js","type":"module","types":"dist/mod.d.ts","gitHead":"21f4b80833cd00846ca118ae02d95c0d5a8479be","_npmUser":{"name":"marianmeres","email":"marian@meres.sk"},"repository":{"url":"git+https://github.com/marianmeres/fsm.git","type":"git"},"_npmVersion":"11.6.2","description":"A lightweight, typed, framework agnostic and synchronous finite state machine that acts as a pure state graph description.","directories":{},"_nodeVersion":"25.2.1","dependencies":{"@marianmeres/clog":"^2.3.3","@marianmeres/pubsub":"^2.2.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/fsm_2.5.1_1764329442359_0.5151755514252296","host":"s3://npm-registry-packages-npm-production"}},"2.5.2":{"name":"@marianmeres/fsm","version":"2.5.2","author":{"name":"Marian Meres"},"license":"MIT","_id":"@marianmeres/fsm@2.5.2","maintainers":[{"name":"marianmeres","email":"marian@meres.sk"}],"homepage":"https://github.com/marianmeres/fsm#readme","bugs":{"url":"https://github.com/marianmeres/fsm/issues"},"dist":{"shasum":"c74199f4db866559a31072a1a461f29332a8aade","tarball":"https://registry.npmjs.org/@marianmeres/fsm/-/fsm-2.5.2.tgz","fileCount":9,"integrity":"sha512-tNkD7na+u53J/gkNPhqNJr91tLOHBKDxcO9B2ftdgqsusam8c7vFevTSu1tjAaXDTqEaKVNlZnYHUewozbg0qg==","signatures":[{"sig":"MEYCIQC1MdO3NAFuuPjyyU+muCL/dtfQq4eacJS9G8aDRqxUfQIhAKRz7bcwRNtIMMN8iGxEtIiIZY268Lb1+uCUZCWks+wc","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":31855},"main":"dist/mod.js","type":"module","types":"dist/mod.d.ts","gitHead":"6e30ef1195e1c5a8fb3ab755e2bbf98703cac52e","_npmUser":{"name":"marianmeres","email":"marian@meres.sk"},"repository":{"url":"git+https://github.com/marianmeres/fsm.git","type":"git"},"_npmVersion":"11.6.2","description":"[![NPM version](https://img.shields.io/npm/v/@marianmeres/fsm.svg)](https://www.npmjs.com/package/@marianmeres/fsm) [![JSR version](https://jsr.io/badges/@marianmeres/fsm)](https://jsr.io/@marianmeres/fsm)","directories":{},"_nodeVersion":"25.2.1","dependencies":{"@marianmeres/clog":"^2.3.3","@marianmeres/pubsub":"^2.2.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/fsm_2.5.2_1764506527000_0.8792416511343344","host":"s3://npm-registry-packages-npm-production"}},"2.5.3":{"name":"@marianmeres/fsm","version":"2.5.3","author":{"name":"Marian Meres"},"license":"MIT","_id":"@marianmeres/fsm@2.5.3","maintainers":[{"name":"marianmeres","email":"marian@meres.sk"}],"homepage":"https://github.com/marianmeres/fsm#readme","bugs":{"url":"https://github.com/marianmeres/fsm/issues"},"dist":{"shasum":"958da81614baa2174b8b4340a1c13c78ff7ad75b","tarball":"https://registry.npmjs.org/@marianmeres/fsm/-/fsm-2.5.3.tgz","fileCount":9,"integrity":"sha512-EcvCvN+J4v0rA5V8sHJAGEOCMQ1582ZizkDL/+boCTih7NAnALgNGi+ZO96aDul7yMWxLBSZr9kAi/uSgCWfEA==","signatures":[{"sig":"MEUCIQDmZBOsafdZR/K9FvPhYhtKdAJbe1w+e5x4ohtVopSzYAIgGopNiOMf5qfchtuPC1fInDr7GQQTtA8UM5CZiwEFUEo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":32005},"main":"dist/mod.js","type":"module","types":"dist/mod.d.ts","gitHead":"7389e2c75dcaed438c7dbbfb6fa12c7f5277d598","_npmUser":{"name":"marianmeres","email":"marian@meres.sk"},"repository":{"url":"git+https://github.com/marianmeres/fsm.git","type":"git"},"_npmVersion":"11.6.2","description":"[![NPM version](https://img.shields.io/npm/v/@marianmeres/fsm.svg)](https://www.npmjs.com/package/@marianmeres/fsm) [![JSR version](https://jsr.io/badges/@marianmeres/fsm)](https://jsr.io/@marianmeres/fsm)","directories":{},"_nodeVersion":"25.2.1","dependencies":{"@marianmeres/clog":"^2.3.3","@marianmeres/pubsub":"^2.2.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/fsm_2.5.3_1764506885569_0.8712807775964821","host":"s3://npm-registry-packages-npm-production"}},"2.5.4":{"name":"@marianmeres/fsm","version":"2.5.4","author":{"name":"Marian Meres"},"license":"MIT","_id":"@marianmeres/fsm@2.5.4","maintainers":[{"name":"marianmeres","email":"marian@meres.sk"}],"homepage":"https://github.com/marianmeres/fsm#readme","bugs":{"url":"https://github.com/marianmeres/fsm/issues"},"dist":{"shasum":"8b22087d22b0836df20bba1180d1d42fb5feab91","tarball":"https://registry.npmjs.org/@marianmeres/fsm/-/fsm-2.5.4.tgz","fileCount":11,"integrity":"sha512-Nq8CXFfFGcIw8d1xOQSgLr9rBbYRTGMRo5G3hLgceUeFWZx9H+COxyiv/LtxHM5w21VBBKDLdeyAEm0sJsvsAQ==","signatures":[{"sig":"MEUCIFe3y7+wOJWar5Lx5dIILDMLN5lT4h/oRvXohZJYWgtfAiEAhdlYuCyl0ZFFjDOZ3AtX7v84eU6o/ZoayMKJHGmL3PY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":39664},"main":"dist/mod.js","type":"module","types":"dist/mod.d.ts","gitHead":"999b6de76e72b930814c9a6886598876e0ec7eef","_npmUser":{"name":"marianmeres","email":"marian@meres.sk"},"repository":{"url":"git+https://github.com/marianmeres/fsm.git","type":"git"},"_npmVersion":"11.6.2","description":"[![NPM version](https://img.shields.io/npm/v/@marianmeres/fsm.svg)](https://www.npmjs.com/package/@marianmeres/fsm) [![JSR version](https://jsr.io/badges/@marianmeres/fsm)](https://jsr.io/@marianmeres/fsm)","directories":{},"_nodeVersion":"25.2.1","dependencies":{"@marianmeres/clog":"^3.2.3","@marianmeres/pubsub":"^2.4.2"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/fsm_2.5.4_1764767282172_0.4780162692974659","host":"s3://npm-registry-packages-npm-production"}},"2.5.5":{"name":"@marianmeres/fsm","version":"2.5.5","author":{"name":"Marian Meres"},"license":"MIT","_id":"@marianmeres/fsm@2.5.5","maintainers":[{"name":"marianmeres","email":"marian@meres.sk"}],"homepage":"https://github.com/marianmeres/fsm#readme","bugs":{"url":"https://github.com/marianmeres/fsm/issues"},"dist":{"shasum":"9a9634f1202766badbd8de8404b9edefdc1bfb01","tarball":"https://registry.npmjs.org/@marianmeres/fsm/-/fsm-2.5.5.tgz","fileCount":11,"integrity":"sha512-HK7w3hxEI19TjDR50Ff8da/zk0wN8jU9Digv6YcKCSdIoNaLnFv2wlAZwsuJUANjbYO5WYBh2F/ZDkQA1TokRw==","signatures":[{"sig":"MEYCIQDWt8If9iks/Vgvx9fz5HXULIMFdsKJajB5+CH45ujNiAIhAOOD2QUalPYakT3N/2nFQbtTt0vnUyLbHPjJVrLe8fy0","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":60782},"main":"dist/mod.js","type":"module","types":"dist/mod.d.ts","gitHead":"d56c39f0af88d5ea5cdb3e91474292727630a3f0","_npmUser":{"name":"marianmeres","email":"marian@meres.sk"},"repository":{"url":"git+https://github.com/marianmeres/fsm.git","type":"git"},"_npmVersion":"11.6.2","description":"[![NPM version](https://img.shields.io/npm/v/@marianmeres/fsm.svg)](https://www.npmjs.com/package/@marianmeres/fsm) [![JSR version](https://jsr.io/badges/@marianmeres/fsm)](https://jsr.io/@marianmeres/fsm)","directories":{},"_nodeVersion":"25.2.1","dependencies":{"@marianmeres/clog":"^3.2.3","@marianmeres/pubsub":"^2.4.2"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/fsm_2.5.5_1764770475235_0.745538127850552","host":"s3://npm-registry-packages-npm-production"}},"2.6.0":{"name":"@marianmeres/fsm","version":"2.6.0","author":{"name":"Marian Meres"},"license":"MIT","_id":"@marianmeres/fsm@2.6.0","maintainers":[{"name":"marianmeres","email":"marian@meres.sk"}],"homepage":"https://github.com/marianmeres/fsm#readme","bugs":{"url":"https://github.com/marianmeres/fsm/issues"},"dist":{"shasum":"0fa6e3fc60144e055fac140018e49ffffe8ed495","tarball":"https://registry.npmjs.org/@marianmeres/fsm/-/fsm-2.6.0.tgz","fileCount":11,"integrity":"sha512-ZYVXJnbK330SCwUWsDFd7JytMgwkb9EDuIJv58v+9ekFQWWxwrjWY0NdzjFjEOCwo4K0cntLskCbFJUGw/rOHg==","signatures":[{"sig":"MEQCIANeJxVTGQfVYp1cpP7DrotIPSrICwT6GP3bQb2Zk9h4AiAcAIoGh1+lbPu1dqvCG9G8IUcN1ZkFpPz1Dg+m6Okz9Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":64244},"main":"dist/mod.js","type":"module","types":"dist/mod.d.ts","gitHead":"a81536510f3150e3dde32b9e8393a97ba0877f31","_npmUser":{"name":"marianmeres","email":"marian@meres.sk"},"repository":{"url":"git+https://github.com/marianmeres/fsm.git","type":"git"},"_npmVersion":"11.6.2","description":"[![NPM version](https://img.shields.io/npm/v/@marianmeres/fsm.svg)](https://www.npmjs.com/package/@marianmeres/fsm) [![JSR version](https://jsr.io/badges/@marianmeres/fsm)](https://jsr.io/@marianmeres/fsm)","directories":{},"_nodeVersion":"25.2.1","dependencies":{"@marianmeres/clog":"^3.2.3","@marianmeres/pubsub":"^2.4.3"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/fsm_2.6.0_1764787474684_0.9864480172986299","host":"s3://npm-registry-packages-npm-production"}},"2.6.1":{"name":"@marianmeres/fsm","version":"2.6.1","author":{"name":"Marian Meres"},"license":"MIT","_id":"@marianmeres/fsm@2.6.1","maintainers":[{"name":"marianmeres","email":"marian@meres.sk"}],"homepage":"https://github.com/marianmeres/fsm#readme","bugs":{"url":"https://github.com/marianmeres/fsm/issues"},"dist":{"shasum":"0d101377d26f659878ae33a3b6050e1678478767","tarball":"https://registry.npmjs.org/@marianmeres/fsm/-/fsm-2.6.1.tgz","fileCount":11,"integrity":"sha512-/v4RA+Bl/9dNAyeXzu5roZSvuMKOXoqZSZ0rkRR9xqUzWY0eQt9G/o6jbS+sujDioxXLg8fKyOWL18pCqgIf8A==","signatures":[{"sig":"MEYCIQDPOwgSI5Ll1VK5QY0VrU12+kwT9vSKA4+FVLeKEGZydwIhAJdKRyCeL0/z9zDCXAwdfoHmQUEOQiyR61zTC8WHPt44","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":65611},"main":"dist/mod.js","type":"module","types":"dist/mod.d.ts","gitHead":"8c2ba87a6437d7a9413954780a9c6423ed39ae22","_npmUser":{"name":"marianmeres","email":"marian@meres.sk"},"repository":{"url":"git+https://github.com/marianmeres/fsm.git","type":"git"},"_npmVersion":"11.6.2","description":"[![NPM version](https://img.shields.io/npm/v/@marianmeres/fsm.svg)](https://www.npmjs.com/package/@marianmeres/fsm) [![JSR version](https://jsr.io/badges/@marianmeres/fsm)](https://jsr.io/@marianmeres/fsm)","directories":{},"_nodeVersion":"25.2.1","dependencies":{"@marianmeres/clog":"^3.2.3","@marianmeres/pubsub":"^2.4.3"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/fsm_2.6.1_1764787834029_0.5178496975635405","host":"s3://npm-registry-packages-npm-production"}},"2.6.2":{"name":"@marianmeres/fsm","version":"2.6.2","author":{"name":"Marian Meres"},"license":"MIT","_id":"@marianmeres/fsm@2.6.2","maintainers":[{"name":"marianmeres","email":"marian@meres.sk"}],"homepage":"https://github.com/marianmeres/fsm#readme","bugs":{"url":"https://github.com/marianmeres/fsm/issues"},"dist":{"shasum":"e3e10e0bcd5113fdcf0efcbb623044faadee2d34","tarball":"https://registry.npmjs.org/@marianmeres/fsm/-/fsm-2.6.2.tgz","fileCount":11,"integrity":"sha512-i19kCb0hBu6DbYkOJwFmnPUPrMStDNLDzhRnaElc7xH0pKy0h+rdIWu0ogKu5PydTaO+Cfr8Foz40EED4GhGzQ==","signatures":[{"sig":"MEUCIQCFQQ8FO3Q6TTb+JnOlIKPP7B/HRLqYq8N4Kbm8e/KgzgIgCOI9z2BZCDTypu5z/6yRbaer8XI4GpLO6xD72H7Ctww=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":66000},"main":"dist/mod.js","type":"module","types":"dist/mod.d.ts","gitHead":"f58f0e0270ab2cb64d7de204074053b1e0d68206","_npmUser":{"name":"marianmeres","email":"marian@meres.sk"},"repository":{"url":"git+https://github.com/marianmeres/fsm.git","type":"git"},"_npmVersion":"11.6.2","description":"[![NPM version](https://img.shields.io/npm/v/@marianmeres/fsm.svg)](https://www.npmjs.com/package/@marianmeres/fsm) [![JSR version](https://jsr.io/badges/@marianmeres/fsm)](https://jsr.io/@marianmeres/fsm)","directories":{},"_nodeVersion":"25.2.1","dependencies":{"@marianmeres/clog":"^3.2.3","@marianmeres/pubsub":"^2.4.3"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/fsm_2.6.2_1764791530579_0.9827231919497459","host":"s3://npm-registry-packages-npm-production"}},"2.6.4":{"name":"@marianmeres/fsm","version":"2.6.4","author":{"name":"Marian Meres"},"license":"MIT","_id":"@marianmeres/fsm@2.6.4","maintainers":[{"name":"marianmeres","email":"marian@meres.sk"}],"homepage":"https://github.com/marianmeres/fsm#readme","bugs":{"url":"https://github.com/marianmeres/fsm/issues"},"dist":{"shasum":"6e68bf4881426f7329d2efcb72e1598c307a6285","tarball":"https://registry.npmjs.org/@marianmeres/fsm/-/fsm-2.6.4.tgz","fileCount":11,"integrity":"sha512-zECLhzChnVHLe00jXYAkyQn6L0gveSBph3dsl+vKXnMJ7kUTR/R5gt840fQvllzMMqZ/gcDAyKNz7tX6YkrvoA==","signatures":[{"sig":"MEQCIAOp3E/dklme1C+xth5/WnKNbBF/cdKL2JTX89sHeNTKAiA54SFwiqwaebLo8ZInV2f1fvU6x6QkvaqNhe3at2naFw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":66000},"main":"dist/mod.js","type":"module","types":"dist/mod.d.ts","gitHead":"a8d8e5640fb1e538cc461593904f7d51e028264d","_npmUser":{"name":"marianmeres","email":"marian@meres.sk"},"repository":{"url":"git+https://github.com/marianmeres/fsm.git","type":"git"},"_npmVersion":"11.6.2","description":"[![NPM version](https://img.shields.io/npm/v/@marianmeres/fsm.svg)](https://www.npmjs.com/package/@marianmeres/fsm) [![JSR version](https://jsr.io/badges/@marianmeres/fsm)](https://jsr.io/@marianmeres/fsm)","directories":{},"_nodeVersion":"25.2.1","dependencies":{"@marianmeres/clog":"^3.2.5","@marianmeres/pubsub":"^2.4.3"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/fsm_2.6.4_1764845609436_0.9574223191326727","host":"s3://npm-registry-packages-npm-production"}},"2.7.0":{"name":"@marianmeres/fsm","version":"2.7.0","author":{"name":"Marian Meres"},"license":"MIT","_id":"@marianmeres/fsm@2.7.0","maintainers":[{"name":"marianmeres","email":"marian@meres.sk"}],"homepage":"https://github.com/marianmeres/fsm#readme","bugs":{"url":"https://github.com/marianmeres/fsm/issues"},"dist":{"shasum":"035e7e72dff9af7802f4ef382394296aecfb6618","tarball":"https://registry.npmjs.org/@marianmeres/fsm/-/fsm-2.7.0.tgz","fileCount":11,"integrity":"sha512-heCpA3F6p6Z6CuJ+T8ttBVVYhROAkG4fegk6KcnD2KznSl8wyoY0ZpC8YpMQYr8Ilqgi2Xbsa6B2RC7YE+LDig==","signatures":[{"sig":"MEYCIQDWrEfnVYD9rz2xO4xBmTmZ02RCZUTKKMw0wSoRU/rmagIhAOA8SlLWQu6zFGHRmhBXHldOQHZhScDyTbepEARVOKVv","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":66464},"main":"dist/mod.js","type":"module","types":"dist/mod.d.ts","gitHead":"fcd2bcfcbcf82d41b72b1936230547bdba956874","_npmUser":{"name":"marianmeres","email":"marian@meres.sk"},"repository":{"url":"git+https://github.com/marianmeres/fsm.git","type":"git"},"_npmVersion":"11.6.2","description":"[![NPM version](https://img.shields.io/npm/v/@marianmeres/fsm.svg)](https://www.npmjs.com/package/@marianmeres/fsm) [![JSR version](https://jsr.io/badges/@marianmeres/fsm)](https://jsr.io/@marianmeres/fsm)","directories":{},"_nodeVersion":"25.2.1","dependencies":{"@marianmeres/clog":"^3.3.0","@marianmeres/pubsub":"^2.4.4"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/fsm_2.7.0_1764951459358_0.2826010205581253","host":"s3://npm-registry-packages-npm-production"}},"2.8.0":{"name":"@marianmeres/fsm","version":"2.8.0","author":{"name":"Marian Meres"},"license":"MIT","_id":"@marianmeres/fsm@2.8.0","maintainers":[{"name":"marianmeres","email":"marian@meres.sk"}],"homepage":"https://github.com/marianmeres/fsm#readme","bugs":{"url":"https://github.com/marianmeres/fsm/issues"},"dist":{"shasum":"ae46338efa552c70fdbb5aa37e3ee991af55e751","tarball":"https://registry.npmjs.org/@marianmeres/fsm/-/fsm-2.8.0.tgz","fileCount":11,"integrity":"sha512-ltpibnJxmymNMVmx6aBg1r2yhybRsuIWLKxeTmNjRlj+QIxQmTf2Fc4b8f5asIapf5EBa+hrKKDy3XhoXMZfTQ==","signatures":[{"sig":"MEYCIQDEFTKwMPYC827Dzv+Z1nAwRQekkF7aDlxLsXnj8x3bGQIhAI55uT7bMMuWmOjteuTj0irdRZN7WLkRlF3DrhR7Fhsn","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":72265},"main":"dist/mod.js","type":"module","types":"dist/mod.d.ts","gitHead":"d0387c365b0cd2378a0e54794002cffed33bceea","_npmUser":{"name":"marianmeres","email":"marian@meres.sk"},"repository":{"url":"git+https://github.com/marianmeres/fsm.git","type":"git"},"_npmVersion":"11.6.2","description":"[![NPM version](https://img.shields.io/npm/v/@marianmeres/fsm.svg)](https://www.npmjs.com/package/@marianmeres/fsm) [![JSR version](https://jsr.io/badges/@marianmeres/fsm)](https://jsr.io/@marianmeres/fsm)","directories":{},"_nodeVersion":"25.2.1","dependencies":{"@marianmeres/clog":"^3.3.0","@marianmeres/pubsub":"^2.4.4"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/fsm_2.8.0_1764953734129_0.7262655968211877","host":"s3://npm-registry-packages-npm-production"}},"2.9.0":{"name":"@marianmeres/fsm","version":"2.9.0","author":{"name":"Marian Meres"},"license":"MIT","_id":"@marianmeres/fsm@2.9.0","maintainers":[{"name":"marianmeres","email":"marian@meres.sk"}],"homepage":"https://github.com/marianmeres/fsm#readme","bugs":{"url":"https://github.com/marianmeres/fsm/issues"},"dist":{"shasum":"eca2549185b58b02b789a17cd1690f5df02c4b41","tarball":"https://registry.npmjs.org/@marianmeres/fsm/-/fsm-2.9.0.tgz","fileCount":11,"integrity":"sha512-UYFNdvAo1kY5kS29gfIpKZpaz9f/HEowAvmQgpQmjW3gk8H5YDgjv1H3v10TuDhr4uBzE/5fBmTAtotzuokpWA==","signatures":[{"sig":"MEYCIQCjNUjBqpBqwqPFUTRoSOigFMLNLG/2ON/EQM8IrwbZlQIhAIMT/hz0fAHFSrQMJ9pDalabGDi9pE82yB51i12lN6KK","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":81708},"main":"dist/mod.js","type":"module","types":"dist/mod.d.ts","gitHead":"ffd2fb213eab1e15595ee28c6983b0c54be99eff","_npmUser":{"name":"marianmeres","email":"marian@meres.sk"},"repository":{"url":"git+https://github.com/marianmeres/fsm.git","type":"git"},"_npmVersion":"11.6.2","description":"[![NPM version](https://img.shields.io/npm/v/@marianmeres/fsm.svg)](https://www.npmjs.com/package/@marianmeres/fsm) [![JSR version](https://jsr.io/badges/@marianmeres/fsm)](https://jsr.io/@marianmeres/fsm)","directories":{},"_nodeVersion":"25.2.1","dependencies":{"@marianmeres/clog":"^3.3.0","@marianmeres/pubsub":"^2.4.4"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/fsm_2.9.0_1764957349789_0.8626039695052745","host":"s3://npm-registry-packages-npm-production"}},"2.10.0":{"name":"@marianmeres/fsm","version":"2.10.0","author":{"name":"Marian Meres"},"license":"MIT","_id":"@marianmeres/fsm@2.10.0","maintainers":[{"name":"marianmeres","email":"marian@meres.sk"}],"homepage":"https://github.com/marianmeres/fsm#readme","bugs":{"url":"https://github.com/marianmeres/fsm/issues"},"dist":{"shasum":"f52a54a8dc4d4242c98bee49fba263edcb565d9f","tarball":"https://registry.npmjs.org/@marianmeres/fsm/-/fsm-2.10.0.tgz","fileCount":11,"integrity":"sha512-s27DD8FPkWRiN4q7JLwcxbvUMvPXXqB4+jwlgC6a9laiJjrZbKIz8y3tf88QcnC06jVTKx9O9T2/Va/SMY7CBg==","signatures":[{"sig":"MEUCIHqlh/JsK+QgK58D03ULiy82Ak25pNudMyRDTheezHZsAiEA1xTVkM3rfGQpwavEBka3ZDkz/Y67duoNlqTLj53K2HY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":82702},"main":"dist/mod.js","type":"module","types":"dist/mod.d.ts","gitHead":"670ff81910f6b9c1f375a9b9195f55a4f6b99c2c","_npmUser":{"name":"marianmeres","email":"marian@meres.sk"},"repository":{"url":"git+https://github.com/marianmeres/fsm.git","type":"git"},"_npmVersion":"11.6.2","description":"[![NPM version](https://img.shields.io/npm/v/@marianmeres/fsm.svg)](https://www.npmjs.com/package/@marianmeres/fsm) [![JSR version](https://jsr.io/badges/@marianmeres/fsm)](https://jsr.io/@marianmeres/fsm)","directories":{},"_nodeVersion":"25.2.1","dependencies":{"@marianmeres/clog":"^3.3.0","@marianmeres/pubsub":"^2.4.4"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/fsm_2.10.0_1764958494101_0.1936610119904445","host":"s3://npm-registry-packages-npm-production"}},"2.11.0":{"name":"@marianmeres/fsm","version":"2.11.0","author":{"name":"Marian Meres"},"license":"MIT","_id":"@marianmeres/fsm@2.11.0","maintainers":[{"name":"marianmeres","email":"marian@meres.sk"}],"homepage":"https://github.com/marianmeres/fsm#readme","bugs":{"url":"https://github.com/marianmeres/fsm/issues"},"dist":{"shasum":"5cdae6a12a3cb27d646c1db319e6a8a231088039","tarball":"https://registry.npmjs.org/@marianmeres/fsm/-/fsm-2.11.0.tgz","fileCount":11,"integrity":"sha512-3/Uv5ZXUSAG1bJ27q6uHHLUcJ5dZYhAcx6mqt/n/dUevlTekXBel93iko8VSAKXojIz7HJx7lzw2GdztCzzHyQ==","signatures":[{"sig":"MEUCICS4gqTk+7iqR3Iseq6TrkQZeN/0WoRWDt9NHiUyH7FNAiEAoPw0cd+sUI9KXHC6NBoUnItvoBPIoB5+9PB4HPDIJxc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":82793},"main":"dist/mod.js","type":"module","types":"dist/mod.d.ts","exports":{".":{"types":"./dist/mod.d.ts","import":"./dist/mod.js"}},"gitHead":"f158960571f2852acec1ac874abbf8bb05a4b8d4","_npmUser":{"name":"marianmeres","email":"marian@meres.sk"},"repository":{"url":"git+https://github.com/marianmeres/fsm.git","type":"git"},"_npmVersion":"11.6.2","description":"[![NPM version](https://img.shields.io/npm/v/@marianmeres/fsm.svg)](https://www.npmjs.com/package/@marianmeres/fsm) [![JSR version](https://jsr.io/badges/@marianmeres/fsm)](https://jsr.io/@marianmeres/fsm)","directories":{},"_nodeVersion":"25.2.1","dependencies":{"@marianmeres/clog":"^3.3.0","@marianmeres/pubsub":"^2.4.4"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/fsm_2.11.0_1764959557175_0.9211268389665863","host":"s3://npm-registry-packages-npm-production"}},"2.11.1":{"name":"@marianmeres/fsm","version":"2.11.1","author":{"name":"Marian Meres"},"license":"MIT","_id":"@marianmeres/fsm@2.11.1","maintainers":[{"name":"marianmeres","email":"marian@meres.sk"}],"homepage":"https://github.com/marianmeres/fsm#readme","bugs":{"url":"https://github.com/marianmeres/fsm/issues"},"dist":{"shasum":"7d88279f6efcd624660763fd15c281346720bf13","tarball":"https://registry.npmjs.org/@marianmeres/fsm/-/fsm-2.11.1.tgz","fileCount":11,"integrity":"sha512-w27gVtF+V9k5KfmOjxXn+xiO1xj/V7QwsXX5DFriomF8crkA7EnpuGFfFt7ifh1ijrRPFHm2uz6TLBN1dwUjGw==","signatures":[{"sig":"MEUCIQD+8Dz+460reoXGvmKqTaLlpuif2jNcpzopwwc7TXfObwIgdZxlfV5pNAAUOV2l2dDlYgYYbccAJP6CeywmTeepCqQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":83203},"main":"dist/mod.js","type":"module","types":"dist/mod.d.ts","exports":{".":{"types":"./dist/mod.d.ts","import":"./dist/mod.js"}},"gitHead":"ee1b65d1ade6ad413eff9ba752e92784325b9c5a","_npmUser":{"name":"marianmeres","email":"marian@meres.sk"},"repository":{"url":"git+https://github.com/marianmeres/fsm.git","type":"git"},"_npmVersion":"11.6.2","description":"[![NPM version](https://img.shields.io/npm/v/@marianmeres/fsm.svg)](https://www.npmjs.com/package/@marianmeres/fsm) [![JSR version](https://jsr.io/badges/@marianmeres/fsm)](https://jsr.io/@marianmeres/fsm)","directories":{},"_nodeVersion":"25.2.1","dependencies":{"@marianmeres/clog":"^3.5.0","@marianmeres/pubsub":"^2.4.4"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/fsm_2.11.1_1765189259284_0.5157478611327571","host":"s3://npm-registry-packages-npm-production"}},"2.12.0":{"name":"@marianmeres/fsm","version":"2.12.0","author":{"name":"Marian Meres"},"license":"MIT","_id":"@marianmeres/fsm@2.12.0","maintainers":[{"name":"marianmeres","email":"marian@meres.sk"}],"homepage":"https://github.com/marianmeres/fsm#readme","bugs":{"url":"https://github.com/marianmeres/fsm/issues"},"dist":{"shasum":"f77cb92a89b45e57788a88279ecd5c80cf07c25d","tarball":"https://registry.npmjs.org/@marianmeres/fsm/-/fsm-2.12.0.tgz","fileCount":13,"integrity":"sha512-T7Z6jO3rB1kMOxDEcyoorj/yJ50vrXkoPUVVvqSein10EjQuKZIJef2f55g0cijdbUUDM5wVITymxhbCDSP3Gg==","signatures":[{"sig":"MEQCICnehJQOhe956cES6OGLvSHjQIzo37ZPp+s082sYrjSgAiBDJ6vEfpr/cjQDrureQZOOnc48CslsFptkHEyLB2WmWA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":100781},"main":"dist/mod.js","type":"module","types":"dist/mod.d.ts","exports":{".":{"types":"./dist/mod.d.ts","import":"./dist/mod.js"}},"gitHead":"07a224c66f381fdad6147d60f273301960e78759","_npmUser":{"name":"marianmeres","email":"marian@meres.sk"},"repository":{"url":"git+https://github.com/marianmeres/fsm.git","type":"git"},"_npmVersion":"11.6.2","description":"[![NPM version](https://img.shields.io/npm/v/@marianmeres/fsm.svg)](https://www.npmjs.com/package/@marianmeres/fsm) [![JSR version](https://jsr.io/badges/@marianmeres/fsm)](https://jsr.io/@marianmeres/fsm)","directories":{},"_nodeVersion":"25.2.1","dependencies":{"@marianmeres/clog":"^3.5.0","@marianmeres/pubsub":"^2.4.4"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/fsm_2.12.0_1765289433802_0.7474272526569399","host":"s3://npm-registry-packages-npm-production"}},"2.13.0":{"name":"@marianmeres/fsm","version":"2.13.0","author":{"name":"Marian Meres"},"license":"MIT","_id":"@marianmeres/fsm@2.13.0","maintainers":[{"name":"marianmeres","email":"marian@meres.sk"}],"homepage":"https://github.com/marianmeres/fsm#readme","bugs":{"url":"https://github.com/marianmeres/fsm/issues"},"dist":{"shasum":"a2b0078b88aa5079009e22d3d47176fff36c19b5","tarball":"https://registry.npmjs.org/@marianmeres/fsm/-/fsm-2.13.0.tgz","fileCount":13,"integrity":"sha512-nEonV1ALXgJvtqs+OaGmxBUOKbeuYfrSzJjznfXTS06hWy7oL7Pszx3aN9TFhU08izyNEjTCwZqmUSbWO1CaWg==","signatures":[{"sig":"MEUCIA7lP5EpFTJ96byEyK7zwAwYv96UbAix7ULYKXapBbyhAiEAj1LpL/tJ3D5ji8b7h1Tq5fM+AErAE/h0afATroYeI5A=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":101680},"main":"dist/mod.js","type":"module","types":"dist/mod.d.ts","exports":{".":{"types":"./dist/mod.d.ts","import":"./dist/mod.js"}},"gitHead":"dc93fac4493f928ebba81c35ee433a4030d6d443","_npmUser":{"name":"marianmeres","email":"marian@meres.sk"},"repository":{"url":"git+https://github.com/marianmeres/fsm.git","type":"git"},"_npmVersion":"11.6.2","description":"[![NPM version](https://img.shields.io/npm/v/@marianmeres/fsm.svg)](https://www.npmjs.com/package/@marianmeres/fsm) [![JSR version](https://jsr.io/badges/@marianmeres/fsm)](https://jsr.io/@marianmeres/fsm)","directories":{},"_nodeVersion":"25.2.1","dependencies":{"@marianmeres/clog":"^3.6.0","@marianmeres/pubsub":"^2.4.4"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/fsm_2.13.0_1765383734616_0.6694187404777836","host":"s3://npm-registry-packages-npm-production"}},"2.13.1":{"name":"@marianmeres/fsm","version":"2.13.1","author":{"name":"Marian Meres"},"license":"MIT","_id":"@marianmeres/fsm@2.13.1","maintainers":[{"name":"marianmeres","email":"marian@meres.sk"}],"homepage":"https://github.com/marianmeres/fsm#readme","bugs":{"url":"https://github.com/marianmeres/fsm/issues"},"dist":{"shasum":"26cc899034eb6ad611ee0a6473443f99877fc983","tarball":"https://registry.npmjs.org/@marianmeres/fsm/-/fsm-2.13.1.tgz","fileCount":13,"integrity":"sha512-TLWk/NaBgI1cN1T17iAI7YYgN809aHNvilqyHDL3/Nd4HPjy9e3ls3O9zG3EOKFE6DVxQWkL1O/Cd2u/s+mxmw==","signatures":[{"sig":"MEQCIHsFuRp4M5P74Cv4cv9dq5nu4Zh/S0NfWb4eiucnK03gAiAJ9LsEZDxQaxGRcSN3kKl4c1dGgaQ+iKOO0ZBK4xTcjQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":103056},"main":"dist/mod.js","type":"module","types":"dist/mod.d.ts","exports":{".":{"types":"./dist/mod.d.ts","import":"./dist/mod.js"}},"gitHead":"9fdd819bbbf7bec1f0d5845e26f821d7db4164ce","_npmUser":{"name":"marianmeres","email":"marian@meres.sk"},"repository":{"url":"git+https://github.com/marianmeres/fsm.git","type":"git"},"_npmVersion":"11.6.2","description":"[![NPM version](https://img.shields.io/npm/v/@marianmeres/fsm.svg)](https://www.npmjs.com/package/@marianmeres/fsm) [![JSR version](https://jsr.io/badges/@marianmeres/fsm)](https://jsr.io/@marianmeres/fsm)","directories":{},"_nodeVersion":"25.2.1","dependencies":{"@marianmeres/clog":"^3.6.0","@marianmeres/pubsub":"^2.4.4"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/fsm_2.13.1_1765383902295_0.7498082417043113","host":"s3://npm-registry-packages-npm-production"}},"2.13.2":{"name":"@marianmeres/fsm","version":"2.13.2","author":{"name":"Marian Meres"},"license":"MIT","_id":"@marianmeres/fsm@2.13.2","maintainers":[{"name":"marianmeres","email":"marian@meres.sk"}],"homepage":"https://github.com/marianmeres/fsm#readme","bugs":{"url":"https://github.com/marianmeres/fsm/issues"},"dist":{"shasum":"1d2d6ff88241a5659a289d2864d59def6b7ba378","tarball":"https://registry.npmjs.org/@marianmeres/fsm/-/fsm-2.13.2.tgz","fileCount":13,"integrity":"sha512-mqfTxbruTLEiTQ7Jp3gSTRMW7v/0xLd+zzIwCW4jDljxbg8xvV48xKFZ0p9CixtpA89GGURAw68SqrOMQbvnbw==","signatures":[{"sig":"MEUCIHFOSx8+bhYKc3ankfjgHy/vhfg11Ihy8XJ3IjQs/tErAiEArpu6c5cLOU2+vYy3B7TXiF9s4O2mOFlpIzBayBFcqqI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":105546},"main":"dist/mod.js","type":"module","types":"dist/mod.d.ts","exports":{".":{"types":"./dist/mod.d.ts","import":"./dist/mod.js"}},"gitHead":"030407e3b05d06e676b94a6c7d28760cd71309a6","_npmUser":{"name":"marianmeres","email":"marian@meres.sk"},"repository":{"url":"git+https://github.com/marianmeres/fsm.git","type":"git"},"_npmVersion":"11.6.2","description":"[![NPM version](https://img.shields.io/npm/v/@marianmeres/fsm.svg)](https://www.npmjs.com/package/@marianmeres/fsm) [![JSR version](https://jsr.io/badges/@marianmeres/fsm)](https://jsr.io/@marianmeres/fsm)","directories":{},"_nodeVersion":"25.2.1","dependencies":{"@marianmeres/clog":"^3.6.0","@marianmeres/pubsub":"^2.4.4"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/fsm_2.13.2_1765384864728_0.842199631565711","host":"s3://npm-registry-packages-npm-production"}},"2.13.3":{"name":"@marianmeres/fsm","version":"2.13.3","author":{"name":"Marian Meres"},"license":"MIT","_id":"@marianmeres/fsm@2.13.3","maintainers":[{"name":"marianmeres","email":"marian@meres.sk"}],"homepage":"https://github.com/marianmeres/fsm#readme","bugs":{"url":"https://github.com/marianmeres/fsm/issues"},"dist":{"shasum":"4e229393437560f7999fb4d073915997b32a3175","tarball":"https://registry.npmjs.org/@marianmeres/fsm/-/fsm-2.13.3.tgz","fileCount":13,"integrity":"sha512-xuMXPDHAc+eMfbmLXVQypXH4JgFIeaAwJx9BQI94kvFR7PXdRujiRTxmWWUM9huwNRKCOzo3UpBxnjNvMjtq3Q==","signatures":[{"sig":"MEQCIFEyJWBWP9XrrSdHuJLKUslgjAl+mYCoDisGQ0brOGOIAiB097VYizQqvz5mXN0C2+oRvhfozLBOGDCimc8hr5vOgw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":105546},"main":"dist/mod.js","type":"module","types":"dist/mod.d.ts","exports":{".":{"types":"./dist/mod.d.ts","import":"./dist/mod.js"}},"gitHead":"3e00121fd9d8f36df78d8830da811b36f7cb03cf","_npmUser":{"name":"marianmeres","email":"marian@meres.sk"},"repository":{"url":"git+https://github.com/marianmeres/fsm.git","type":"git"},"_npmVersion":"11.6.2","description":"[![NPM version](https://img.shields.io/npm/v/@marianmeres/fsm.svg)](https://www.npmjs.com/package/@marianmeres/fsm) [![JSR version](https://jsr.io/badges/@marianmeres/fsm)](https://jsr.io/@marianmeres/fsm)","directories":{},"_nodeVersion":"25.2.1","dependencies":{"@marianmeres/clog":"^3.6.0","@marianmeres/pubsub":"^2.4.4"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/fsm_2.13.3_1765387771484_0.8702623133962035","host":"s3://npm-registry-packages-npm-production"}},"2.14.0":{"name":"@marianmeres/fsm","version":"2.14.0","author":{"name":"Marian Meres"},"license":"MIT","_id":"@marianmeres/fsm@2.14.0","maintainers":[{"name":"marianmeres","email":"marian@meres.sk"}],"homepage":"https://github.com/marianmeres/fsm#readme","bugs":{"url":"https://github.com/marianmeres/fsm/issues"},"dist":{"shasum":"5e40e6d5041edb029f89ca675f270d7ebb4317e6","tarball":"https://registry.npmjs.org/@marianmeres/fsm/-/fsm-2.14.0.tgz","fileCount":13,"integrity":"sha512-RYfST3EhtQuBk991nDtfuItmVYU5W8zwNV25VKCOfhXiaHIhKFdTeIjZV93YHFhAG7E34+LH8bnv1Wkw8B1I9A==","signatures":[{"sig":"MEUCIEd77adkShsFx4gb3u+JZvivXBxZ1eCpIu+lh2X5Q2zYAiEA8e2WeY/WetytSWaflJJWzp5zcH9AmS3pImxRD7iyAlY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":110652},"main":"dist/mod.js","type":"module","types":"dist/mod.d.ts","exports":{".":{"types":"./dist/mod.d.ts","import":"./dist/mod.js"}},"gitHead":"973ffc7cf8d214527544c2792b8f773973789ab0","_npmUser":{"name":"marianmeres","email":"marian@meres.sk"},"repository":{"url":"git+https://github.com/marianmeres/fsm.git","type":"git"},"_npmVersion":"11.6.2","description":"[![NPM version](https://img.shields.io/npm/v/@marianmeres/fsm.svg)](https://www.npmjs.com/package/@marianmeres/fsm) [![JSR version](https://jsr.io/badges/@marianmeres/fsm)](https://jsr.io/@marianmeres/fsm)","directories":{},"_nodeVersion":"25.2.1","dependencies":{"@marianmeres/clog":"^3.6.0","@marianmeres/pubsub":"^2.4.4"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/fsm_2.14.0_1765389315807_0.5648223381806325","host":"s3://npm-registry-packages-npm-production"}},"2.15.0":{"name":"@marianmeres/fsm","version":"2.15.0","author":{"name":"Marian Meres"},"license":"MIT","_id":"@marianmeres/fsm@2.15.0","maintainers":[{"name":"marianmeres","email":"marian@meres.sk"}],"homepage":"https://github.com/marianmeres/fsm#readme","bugs":{"url":"https://github.com/marianmeres/fsm/issues"},"dist":{"shasum":"e3fb536c7f69ff6ccab8a3be3bc58a0a6d91f813","tarball":"https://registry.npmjs.org/@marianmeres/fsm/-/fsm-2.15.0.tgz","fileCount":13,"integrity":"sha512-MyG7/wVyl82jUp6qhwUwtjNMXV/TBR+xBbGO6Ib6NICoIVyP8u5WyXQrN1I7sZQH/I0fIpBfbXaBI37Y+hquxg==","signatures":[{"sig":"MEYCIQDhI1kuMK35147aMTdYqQkMsw2/YnqR5wqSDn47wm2LMgIhALRRoNnK5BCPSgVBvNAoTAL54u5pWOjEc9vfEa8iMsZQ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":117590},"main":"dist/mod.js","type":"module","types":"dist/mod.d.ts","exports":{".":{"types":"./dist/mod.d.ts","import":"./dist/mod.js"}},"gitHead":"56d6c9d777c3b78f42b981879219fd6d27844dc9","_npmUser":{"name":"marianmeres","email":"marian@meres.sk"},"repository":{"url":"git+https://github.com/marianmeres/fsm.git","type":"git"},"_npmVersion":"11.6.2","description":"[![NPM version](https://img.shields.io/npm/v/@marianmeres/fsm.svg)](https://www.npmjs.com/package/@marianmeres/fsm) [![JSR version](https://jsr.io/badges/@marianmeres/fsm)](https://jsr.io/@marianmeres/fsm)","directories":{},"_nodeVersion":"25.2.1","dependencies":{"@marianmeres/clog":"^3.8.4","@marianmeres/pubsub":"^2.4.4"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/fsm_2.15.0_1765719052069_0.9951242059746868","host":"s3://npm-registry-packages-npm-production"}},"2.16.0":{"name":"@marianmeres/fsm","version":"2.16.0","author":{"name":"Marian Meres"},"license":"MIT","_id":"@marianmeres/fsm@2.16.0","maintainers":[{"name":"marianmeres","email":"marian@meres.sk"}],"homepage":"https://github.com/marianmeres/fsm#readme","bugs":{"url":"https://github.com/marianmeres/fsm/issues"},"dist":{"shasum":"62c0952ff073469c37a12007b9cc5f8058a462cf","tarball":"https://registry.npmjs.org/@marianmeres/fsm/-/fsm-2.16.0.tgz","fileCount":13,"integrity":"sha512-5LX99rKCp2cWVWvNd46YaFIkVsMBC6RR81rMFI5KdeBfEQpzlgGtAt5LuVfpoPfX6AGb6nPkkBT6WGAr3cfctA==","signatures":[{"sig":"MEQCIBPd/kjqzIXk9UhPN0UZcF4Tnmszbh3pDBdyV6LT5NODAiAUM/5DTvM6+kCyt4xpbXu/nG/u4sD+0U7uqINEc8lQTg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":115957},"main":"dist/mod.js","type":"module","types":"dist/mod.d.ts","exports":{".":{"types":"./dist/mod.d.ts","import":"./dist/mod.js"}},"gitHead":"9af807788221f11e5acc4c7ce4cffcdd0159ad43","_npmUser":{"name":"marianmeres","email":"marian@meres.sk"},"repository":{"url":"git+https://github.com/marianmeres/fsm.git","type":"git"},"_npmVersion":"11.6.2","description":"[![NPM version](https://img.shields.io/npm/v/@marianmeres/fsm.svg)](https://www.npmjs.com/package/@marianmeres/fsm) [![JSR version](https://jsr.io/badges/@marianmeres/fsm)](https://jsr.io/@marianmeres/fsm)","directories":{},"_nodeVersion":"25.2.1","dependencies":{"@marianmeres/clog":"^3.10.0","@marianmeres/pubsub":"^2.4.4"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/fsm_2.16.0_1765815480060_0.013038107955565481","host":"s3://npm-registry-packages-npm-production"}},"2.16.1":{"name":"@marianmeres/fsm","version":"2.16.1","author":{"name":"Marian Meres"},"license":"MIT","_id":"@marianmeres/fsm@2.16.1","maintainers":[{"name":"marianmeres","email":"marian@meres.sk"}],"homepage":"https://github.com/marianmeres/fsm#readme","bugs":{"url":"https://github.com/marianmeres/fsm/issues"},"dist":{"shasum":"a947dfe37466e89a6f775a904e1cc01d0c18e7e8","tarball":"https://registry.npmjs.org/@marianmeres/fsm/-/fsm-2.16.1.tgz","fileCount":13,"integrity":"sha512-Y1t4tSYdfHrAx5+BazPDjVEf4VLIGlr1+qvrCJvLSBOKQZucIpa6DzVGznpAzCnCR5sm3nGsiefNR1yLOUDn/g==","signatures":[{"sig":"MEUCIQDiIExSwVLYhHwWJbqUx6UZJyfo8sHBhsEZUHdXlRHLVgIgfUbuldgpi44WY+NPcjEpnm9RM7wSz+VAGuBzZY+o1ZM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":115957},"main":"dist/mod.js","type":"module","types":"dist/mod.d.ts","exports":{".":{"types":"./dist/mod.d.ts","import":"./dist/mod.js"}},"gitHead":"f11472ad6c9c45125ddf6a4616da0304fe94a0a6","_npmUser":{"name":"marianmeres","email":"marian@meres.sk"},"repository":{"url":"git+https://github.com/marianmeres/fsm.git","type":"git"},"_npmVersion":"11.6.2","description":"[![NPM version](https://img.shields.io/npm/v/@marianmeres/fsm.svg)](https://www.npmjs.com/package/@marianmeres/fsm) [![JSR version](https://jsr.io/badges/@marianmeres/fsm)](https://jsr.io/@marianmeres/fsm)","directories":{},"_nodeVersion":"25.2.1","dependencies":{"@marianmeres/clog":"^3.10.2","@marianmeres/pubsub":"^2.4.4"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/fsm_2.16.1_1765879628133_0.48046113648402855","host":"s3://npm-registry-packages-npm-production"}},"2.16.2":{"name":"@marianmeres/fsm","version":"2.16.2","author":{"name":"Marian Meres"},"license":"MIT","_id":"@marianmeres/fsm@2.16.2","maintainers":[{"name":"marianmeres","email":"marian@meres.sk"}],"homepage":"https://github.com/marianmeres/fsm#readme","bugs":{"url":"https://github.com/marianmeres/fsm/issues"},"dist":{"shasum":"fccbdd6ac66e60a0c00f99c26756be5d580d0ea8","tarball":"https://registry.npmjs.org/@marianmeres/fsm/-/fsm-2.16.2.tgz","fileCount":13,"integrity":"sha512-LcCgNJenEuSfxZvSjNvCSwtGM5Z7G9pkX8yRBlOMKcPCvuGNG9YAPETxNWEQGIgixx3hfub4aXcX2o//kLWEKg==","signatures":[{"sig":"MEQCIF0hwhr0x0PkdCKiSxZxBbs5JKoEMorfbEGOHqPuGardAiAQcHUDzTVHN6AyQc+u0OxK/hHgUT0nm2HtX353TaSiJQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":115957},"main":"dist/mod.js","type":"module","types":"dist/mod.d.ts","exports":{".":{"types":"./dist/mod.d.ts","import":"./dist/mod.js"}},"gitHead":"88ee059bded8dc632354d270ecf9fcfbfa36900e","_npmUser":{"name":"marianmeres","email":"marian@meres.sk"},"repository":{"url":"git+https://github.com/marianmeres/fsm.git","type":"git"},"_npmVersion":"11.6.2","description":"[![NPM version](https://img.shields.io/npm/v/@marianmeres/fsm.svg)](https://www.npmjs.com/package/@marianmeres/fsm) [![JSR version](https://jsr.io/badges/@marianmeres/fsm)](https://jsr.io/@marianmeres/fsm)","directories":{},"_nodeVersion":"25.2.1","dependencies":{"@marianmeres/clog":"^3.11.0","@marianmeres/pubsub":"^2.4.4"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/fsm_2.16.2_1765985406465_0.8585606410455067","host":"s3://npm-registry-packages-npm-production"}},"2.16.3":{"name":"@marianmeres/fsm","version":"2.16.3","author":{"name":"Marian Meres"},"license":"MIT","_id":"@marianmeres/fsm@2.16.3","maintainers":[{"name":"marianmeres","email":"marian@meres.sk"}],"homepage":"https://github.com/marianmeres/fsm#readme","bugs":{"url":"https://github.com/marianmeres/fsm/issues"},"dist":{"shasum":"8d86d0d3255ec6b551145370964fd8ec1f065c83","tarball":"https://registry.npmjs.org/@marianmeres/fsm/-/fsm-2.16.3.tgz","fileCount":13,"integrity":"sha512-JMysQ5RDhOljQVaJVt5w0AUcFiRGYD3VT4Y5102mTUo6EAvfyF2c3csvMhUlkeg92YVlu9sNdO51r6yVU9sRTQ==","signatures":[{"sig":"MEQCIEeFatm1r8P3yWXE5Hg4wFJBSi9yfc2OW5LxB6KunW5UAiAsQAs2c5QQbj2sRHeCNg8INHtDTtBGm0o/zkL6crlenQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":115957},"main":"dist/mod.js","type":"module","types":"dist/mod.d.ts","exports":{".":{"types":"./dist/mod.d.ts","import":"./dist/mod.js"}},"gitHead":"3f22a9fb21e7da0629489cb5dda69385886b150d","_npmUser":{"name":"marianmeres","email":"marian@meres.sk"},"repository":{"url":"git+https://github.com/marianmeres/fsm.git","type":"git"},"_npmVersion":"11.6.2","description":"[![NPM version](https://img.shields.io/npm/v/@marianmeres/fsm.svg)](https://www.npmjs.com/package/@marianmeres/fsm) [![JSR version](https://jsr.io/badges/@marianmeres/fsm)](https://jsr.io/@marianmeres/fsm)","directories":{},"_nodeVersion":"25.2.1","dependencies":{"@marianmeres/clog":"^3.12.0","@marianmeres/pubsub":"^2.4.4"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/fsm_2.16.3_1765990830043_0.6903675273483851","host":"s3://npm-registry-packages-npm-production"}},"2.16.4":{"name":"@marianmeres/fsm","version":"2.16.4","author":{"name":"Marian Meres"},"license":"MIT","_id":"@marianmeres/fsm@2.16.4","maintainers":[{"name":"marianmeres","email":"marian@meres.sk"}],"homepage":"https://github.com/marianmeres/fsm#readme","bugs":{"url":"https://github.com/marianmeres/fsm/issues"},"dist":{"shasum":"0ed7d9536f81d4a4b9fb0d3d3fe5b8766a65f0be","tarball":"https://registry.npmjs.org/@marianmeres/fsm/-/fsm-2.16.4.tgz","fileCount":13,"integrity":"sha512-oIfdVI00ayv60odXbBbpIAV6VYvdboQGLcz8251F2JM4Ae8lKzNN3i0tgryOj7433NMl1E95Twin96tVhqonyQ==","signatures":[{"sig":"MEQCIEyjBhSG3jEeRLFi7i6NRuGZzeVVAaSx1mbHSPk+U+BFAiAZ++AYI8koKko5pMxVT/3C1tdEI4DHyeJCr8EKDHvzbg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":116019},"main":"dist/mod.js","type":"module","types":"dist/mod.d.ts","exports":{".":{"types":"./dist/mod.d.ts","import":"./dist/mod.js"}},"gitHead":"ba4c51bea5c0b1a4478dbc59fcdf99dbc98122d5","_npmUser":{"name":"marianmeres","email":"marian@meres.sk"},"repository":{"url":"git+https://github.com/marianmeres/fsm.git","type":"git"},"_npmVersion":"11.6.2","description":"[![NPM version](https://img.shields.io/npm/v/@marianmeres/fsm.svg)](https://www.npmjs.com/package/@marianmeres/fsm) [![JSR version](https://jsr.io/badges/@marianmeres/fsm)](https://jsr.io/@marianmeres/fsm)","directories":{},"_nodeVersion":"25.2.1","dependencies":{"@marianmeres/clog":"^3.12.0","@marianmeres/pubsub":"^2.4.4"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/fsm_2.16.4_1765996967545_0.7797391723701668","host":"s3://npm-registry-packages-npm-production"}},"2.16.5":{"name":"@marianmeres/fsm","version":"2.16.5","author":{"name":"Marian Meres"},"license":"MIT","_id":"@marianmeres/fsm@2.16.5","maintainers":[{"name":"marianmeres","email":"marian@meres.sk"}],"homepage":"https://github.com/marianmeres/fsm#readme","bugs":{"url":"https://github.com/marianmeres/fsm/issues"},"dist":{"shasum":"8e3c4550140b9639288f280bd2b940a92473a953","tarball":"https://registry.npmjs.org/@marianmeres/fsm/-/fsm-2.16.5.tgz","fileCount":13,"integrity":"sha512-8+Wv7kdPY6vSnazpfINfZYrk1VG+JcsicsHCnBEp7b2pagWHPozP4xWfb15ksvKix+6RUMNlNS8qplio6aBlwA==","signatures":[{"sig":"MEUCIDLGDwSSF8/BHdJNf8i1JCBIX6sLujYXbY7X2WnqxpykAiEAp3w0TDg2GPHs8okqIZg9mpSX4dO9cxK09Gyy2yzxe5U=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":116293},"main":"dist/mod.js","type":"module","types":"dist/mod.d.ts","exports":{".":{"types":"./dist/mod.d.ts","import":"./dist/mod.js"}},"gitHead":"664afb8148f872f3fb3c8596c091bc5f8cf2e08c","_npmUser":{"name":"marianmeres","email":"marian@meres.sk"},"repository":{"url":"git+https://github.com/marianmeres/fsm.git","type":"git"},"_npmVersion":"11.8.0","description":"[![NPM version](https://img.shields.io/npm/v/@marianmeres/fsm.svg)](https://www.npmjs.com/package/@marianmeres/fsm) [![JSR version](https://jsr.io/badges/@marianmeres/fsm)](https://jsr.io/@marianmeres/fsm) [![License](https://img.shields.io/npm/l/@marianm","directories":{},"_nodeVersion":"25.5.0","dependencies":{"@marianmeres/clog":"^3.15.2","@marianmeres/pubsub":"^2.4.6"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/fsm_2.16.5_1770270217202_0.9862679088677315","host":"s3://npm-registry-packages-npm-production"}},"3.0.0":{"name":"@marianmeres/fsm","version":"3.0.0","author":{"name":"Marian Meres"},"license":"MIT","_id":"@marianmeres/fsm@3.0.0","maintainers":[{"name":"marianmeres","email":"marian@meres.sk"}],"homepage":"https://github.com/marianmeres/fsm#readme","bugs":{"url":"https://github.com/marianmeres/fsm/issues"},"dist":{"shasum":"6905997829808b4a4024cf8bb2ef5b69ee98d5da","tarball":"https://registry.npmjs.org/@marianmeres/fsm/-/fsm-3.0.0.tgz","fileCount":14,"integrity":"sha512-8De6i3aStciYSE1o16qBdALyvC4xGMV+ze0rcpEZrJxoQKlHeGSHhxmUT7tOt+/wlrWplbmYUOaSMD8u2M4HJw==","signatures":[{"sig":"MEQCIDkjDPA1XtTipjeR6QhKmAJjvCsXRrQ4gSTh5sLiIiYbAiAcIiYgqLQO4LUaOM31YdoC5i+hvTWeEwx8vMs79FmSRQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":138715},"main":"dist/mod.js","type":"module","types":"dist/mod.d.ts","exports":{".":{"types":"./dist/mod.d.ts","import":"./dist/mod.js"}},"gitHead":"2250260980b8bd090478b415cd51cb70c7f99238","_npmUser":{"name":"marianmeres","email":"marian@meres.sk"},"repository":{"url":"git+https://github.com/marianmeres/fsm.git","type":"git"},"_npmVersion":"11.12.1","description":"[![NPM version](https://img.shields.io/npm/v/@marianmeres/fsm.svg)](https://www.npmjs.com/package/@marianmeres/fsm) [![JSR version](https://jsr.io/badges/@marianmeres/fsm)](https://jsr.io/@marianmeres/fsm) [![License](https://img.shields.io/npm/l/@marianm","directories":{},"_nodeVersion":"25.9.0","dependencies":{"@marianmeres/clog":"^3.17.0","@marianmeres/pubsub":"^3.0.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/fsm_3.0.0_1776409768357_0.4486010162825953","host":"s3://npm-registry-packages-npm-production"}},"3.0.1":{"name":"@marianmeres/fsm","version":"3.0.1","author":{"name":"Marian Meres"},"license":"MIT","_id":"@marianmeres/fsm@3.0.1","maintainers":[{"name":"marianmeres","email":"marian@meres.sk"}],"homepage":"https://github.com/marianmeres/fsm#readme","bugs":{"url":"https://github.com/marianmeres/fsm/issues"},"dist":{"shasum":"322032c09f6870d5839c87f41b6dfcf1c1cd5da9","tarball":"https://registry.npmjs.org/@marianmeres/fsm/-/fsm-3.0.1.tgz","fileCount":14,"integrity":"sha512-fx3T6tpuLCMbzmZXzAGHXEMjkwY0PTwhLnlB/BtN0d+c1ccqhOhHII1Mpoh8YjoL05ezUeJhjuWUibClr4VD1A==","signatures":[{"sig":"MEQCIA+Mff1SywMRmDv2GO5Yu4G+5aaOVHf67ltlqxNAnZQ2AiBqm4r0UJq2gJb5F0XF6xtSibwg4Wu4YCmGfnSNs8aPbQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":138715},"main":"dist/mod.js","type":"module","types":"dist/mod.d.ts","exports":{".":{"types":"./dist/mod.d.ts","import":"./dist/mod.js"}},"gitHead":"ffc5e88ba64db5bfeb130b16408a31d05308f82d","_npmUser":{"name":"marianmeres","email":"marian@meres.sk"},"repository":{"url":"git+https://github.com/marianmeres/fsm.git","type":"git"},"_npmVersion":"11.12.1","description":"[![NPM version](https://img.shields.io/npm/v/@marianmeres/fsm.svg)](https://www.npmjs.com/package/@marianmeres/fsm) [![JSR version](https://jsr.io/badges/@marianmeres/fsm)](https://jsr.io/@marianmeres/fsm) [![License](https://img.shields.io/npm/l/@marianm","directories":{},"_nodeVersion":"25.9.0","dependencies":{"@marianmeres/clog":"^3.17.1","@marianmeres/pubsub":"^3.0.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/fsm_3.0.1_1776528159623_0.0655573715260982","host":"s3://npm-registry-packages-npm-production"}},"3.1.0":{"name":"@marianmeres/fsm","version":"3.1.0","type":"module","main":"dist/mod.js","types":"dist/mod.d.ts","exports":{".":{"types":"./dist/mod.d.ts","import":"./dist/mod.js"}},"author":{"name":"Marian Meres"},"license":"MIT","dependencies":{"@marianmeres/clog":"^3.21.0","@marianmeres/pubsub":"^3.0.0"},"repository":{"type":"git","url":"git+https://github.com/marianmeres/fsm.git"},"bugs":{"url":"https://github.com/marianmeres/fsm/issues"},"gitHead":"318b06a8c80b0f6a8b508bc7450c914c869baf9b","_id":"@marianmeres/fsm@3.1.0","description":"[![NPM version](https://img.shields.io/npm/v/@marianmeres/fsm.svg)](https://www.npmjs.com/package/@marianmeres/fsm) [![JSR version](https://jsr.io/badges/@marianmeres/fsm)](https://jsr.io/@marianmeres/fsm) [![License](https://img.shields.io/npm/l/@marianm","homepage":"https://github.com/marianmeres/fsm#readme","_nodeVersion":"25.9.0","_npmVersion":"11.12.1","dist":{"integrity":"sha512-j4GhfftbIKAau/Ir5LiFNf1SWR73lBxbs+umBPCjeQyYZGppZHmuSsnwPH8ov/hujNqaAEQQih7ulC0RZMZspA==","shasum":"4fbdcf4b6af13d50e9567620b8e78cab9d6d1efc","tarball":"https://registry.npmjs.org/@marianmeres/fsm/-/fsm-3.1.0.tgz","fileCount":14,"unpackedSize":156308,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIAxMtRUqIDOS5cN76+umBqEehnfEDPYnCcZuP2aOLxFPAiEAhIEgECzd2wSG91QpU/jj1NFxcKM4irzttmyG8R2ovmQ="}]},"_npmUser":{"name":"marianmeres","email":"marian@meres.sk"},"directories":{},"maintainers":[{"name":"marianmeres","email":"marian@meres.sk"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/fsm_3.1.0_1779223407647_0.1881042931282555"},"_hasShrinkwrap":false}},"time":{"created":"2025-11-21T16:46:21.181Z","modified":"2026-05-19T20:43:27.890Z","2.0.0":"2025-11-21T16:46:21.531Z","2.0.1":"2025-11-22T05:58:19.227Z","2.2.0":"2025-11-22T09:28:06.773Z","2.3.0":"2025-11-27T05:37:23.772Z","2.4.0":"2025-11-28T08:43:57.146Z","2.4.1":"2025-11-28T09:01:12.579Z","2.5.0":"2025-11-28T10:04:46.537Z","2.5.1":"2025-11-28T11:30:42.557Z","2.5.2":"2025-11-30T12:42:07.207Z","2.5.3":"2025-11-30T12:48:05.816Z","2.5.4":"2025-12-03T13:08:02.346Z","2.5.5":"2025-12-03T14:01:15.436Z","2.6.0":"2025-12-03T18:44:34.883Z","2.6.1":"2025-12-03T18:50:34.213Z","2.6.2":"2025-12-03T19:52:10.769Z","2.6.4":"2025-12-04T10:53:29.575Z","2.7.0":"2025-12-05T16:17:39.511Z","2.8.0":"2025-12-05T16:55:34.254Z","2.9.0":"2025-12-05T17:55:49.917Z","2.10.0":"2025-12-05T18:14:54.475Z","2.11.0":"2025-12-05T18:32:37.331Z","2.11.1":"2025-12-08T10:20:59.420Z","2.12.0":"2025-12-09T14:10:33.967Z","2.13.0":"2025-12-10T16:22:14.814Z","2.13.1":"2025-12-10T16:25:02.494Z","2.13.2":"2025-12-10T16:41:04.877Z","2.13.3":"2025-12-10T17:29:31.655Z","2.14.0":"2025-12-10T17:55:15.948Z","2.15.0":"2025-12-14T13:30:52.272Z","2.16.0":"2025-12-15T16:18:00.194Z","2.16.1":"2025-12-16T10:07:08.264Z","2.16.2":"2025-12-17T15:30:06.628Z","2.16.3":"2025-12-17T17:00:30.200Z","2.16.4":"2025-12-17T18:42:47.694Z","2.16.5":"2026-02-05T05:43:37.348Z","3.0.0":"2026-04-17T07:09:28.477Z","3.0.1":"2026-04-18T16:02:39.763Z","3.1.0":"2026-05-19T20:43:27.786Z"},"bugs":{"url":"https://github.com/marianmeres/fsm/issues"},"author":{"name":"Marian Meres"},"license":"MIT","homepage":"https://github.com/marianmeres/fsm#readme","repository":{"type":"git","url":"git+https://github.com/marianmeres/fsm.git"},"description":"[![NPM version](https://img.shields.io/npm/v/@marianmeres/fsm.svg)](https://www.npmjs.com/package/@marianmeres/fsm) [![JSR version](https://jsr.io/badges/@marianmeres/fsm)](https://jsr.io/@marianmeres/fsm) [![License](https://img.shields.io/npm/l/@marianm","maintainers":[{"name":"marianmeres","email":"marian@meres.sk"}],"readme":"# @marianmeres/fsm\n\n[![NPM version](https://img.shields.io/npm/v/@marianmeres/fsm.svg)](https://www.npmjs.com/package/@marianmeres/fsm)\n[![JSR version](https://jsr.io/badges/@marianmeres/fsm)](https://jsr.io/@marianmeres/fsm)\n[![License](https://img.shields.io/npm/l/@marianmeres/fsm)](LICENSE)\n\nA lightweight, typed, framework agnostic and synchronous finite state machine that acts as a pure state graph description.\n\nIt manages state transitions and enforces rules via **guards**, **transition actions**, and **lifecycle hooks** (`onEnter`/`onExit`), but contains no business logic by design.\n\nTo integrate into your application, wrap this FSM in a layer that handles your business logic and calls `fsm.transition(name, payload)` in response to events.\n\nThis separation ensures the state machine remains simple, testable, and reusable across different contexts.\n\n## Install\n```sh\ndeno add jsr:@marianmeres/fsm\n```\n```sh\nnpm install @marianmeres/fsm\n```\n\n> **Upgrading from v2?** See [CHANGELOG.md](CHANGELOG.md) for the full list of v3\n> breaking changes. Headline items: `transition(..., false)` returns `null` on\n> failure, `reset()` runs lifecycle hooks, wildcard `\"*\"` is now used as a fallback\n> when a specific event's guards reject, and `composeFsmConfig`'s `onConflict`\n> option was renamed to `onInitialConflict`.\n\n## Example\n\n```typescript\nimport { FSM } from \"@marianmeres/fsm\";\n```\n\n```typescript\ntype STATES = \"IDLE\" | \"FETCHING\" | \"RETRYING\" | \"SUCCESS\" | \"FAILED\";\ntype EVENTS = \"fetch\" | \"resolve\" | \"reject\" | \"retry\" | \"reset\";\ntype CONTEXT = { attempts: number; maxRetries: number; data: unknown; error: unknown; };\n\nconst fsm = new FSM<STATES, EVENTS, CONTEXT>({\n    initial: \"IDLE\",\n    // Use a factory function for context to ensure a fresh object on reset()\n    context: () => ({ attempts: 0, maxRetries: 2, data: null, error: null }),\n    states: {\n        IDLE: {\n            on: { fetch: \"FETCHING\" }, // simple string notation\n        },\n        FETCHING: {\n            onEnter: (context) => {\n                context.attempts += 1;\n            },\n            on: {\n                resolve: \"SUCCESS\",\n                // will resolve to first guard passing state\n                reject: [\n                    {\n                        target: \"RETRYING\",\n                        guard: (ctx) => ctx.attempts < ctx.maxRetries,\n                        // Action executes specifically on this transition edge\n                        action: (ctx) => {\n                            console.log(`Attempt ${ctx.attempts} failed...`)\n                        },\n                    },\n                    {\n                        target: \"FAILED\",\n                        guard: (ctx) => ctx.attempts >= ctx.maxRetries,\n                    },\n                ],\n            },\n        },\n        RETRYING: {\n            on: { retry: \"FETCHING\" },\n        },\n        SUCCESS: {\n            onEnter: (context, data) => {\n                context.data = data;\n            },\n            on: { reset: \"IDLE\" },\n        },\n        FAILED: {\n            onEnter: (context, error) => {\n                context.error = error;\n            },\n            on: { reset: \"IDLE\" },\n        },\n    },\n}); \n\n// examples:\n\n// subscribe to reactive updates\nconst unsub = fsm.subscribe(({ current, context }) => log.push({ current, context }));\n\nassertEquals(fsm.is(\"IDLE\"), true);\n\n// `transition` is the main API function\nassertEquals(fsm.transition(\"fetch\"), \"FETCHING\");\n\n// this must throw - cannot \"retry\" from \"FETCHING\"\nassertThrows(() => fsm.transition(\"retry\"));\n\n// non-reactive props\nconsole.log(fsm.state, fsm.context);\n\n```\n\n## Events vs Transitions\n\nUnderstanding the distinction between **events** and **transitions** helps clarify FSM concepts:\n\n| **Event** | **Transition** |\n|-----------|----------------|\n| The trigger/signal — *what happened* | The response/rule — *what to do about it* |\n| A name like `\"click\"`, `\"submit\"`, `\"timeout\"` | The full definition: target state + guard + action |\n| External input to the FSM | Internal FSM configuration |\n| **Sent** to the machine | **Defined** in the machine |\n\nIn the configuration, the `on` property maps **events** to **transitions**:\n\n```typescript\nstates: {\n    IDLE: {\n        on: {\n            \"load\": \"LOADING\"  // ← \"load\" is the EVENT\n                               // ← \"LOADING\" (or full object) is the TRANSITION\n        }\n    }\n}\n```\n\n**Mental model:** Think of a vending machine — you press button \"A3\" (the **event**), and the machine's internal rule says \"if in READY state and button A3 pressed, dispense item and go to DISPENSING state\" (the **transition**).\n\nMore simply: **Event** = \"What did you say?\" / **Transition** = \"What I'll do about it.\"\n\n## Mermaid Diagram Support\n\nThe FSM includes built-in support for [Mermaid](https://mermaid.js.org/) state diagrams, enabling visualization, documentation, and even diagram-driven development.\n\n### Exporting to Mermaid (`toMermaid`)\n\nGenerate a Mermaid state diagram from your FSM definition:\n\n```typescript\nconsole.log(fsm.toMermaid());\n```\n\nOutput:\n```\nstateDiagram-v2\n    [*] --> IDLE\n    IDLE --> FETCHING: fetch\n    FETCHING --> SUCCESS: resolve\n    FETCHING --> RETRYING: reject [guard 1] / (action)\n    FETCHING --> FAILED: reject [guard 2]\n    RETRYING --> FETCHING: retry\n    SUCCESS --> IDLE: reset\n    FAILED --> IDLE: reset\n```\n\n![State Diagram](mermaid.png \"State Diagram\")\n\nThis is useful for:\n- **Documentation**: Automatically generate up-to-date diagrams from code\n- **Debugging**: Visualize complex state machines to understand flow\n- **Communication**: Share state machine designs with non-technical stakeholders\n\n### Parsing from Mermaid (`fromMermaid`)\n\nCreate an FSM instance directly from a Mermaid diagram string:\n\n```typescript\nconst fsm = FSM.fromMermaid(`\nstateDiagram-v2\n    [*] --> IDLE\n    IDLE --> LOADING: fetch\n    LOADING --> SUCCESS: resolve\n    LOADING --> ERROR: reject\n    SUCCESS --> IDLE: reset\n    ERROR --> IDLE: reset\n`);\n\n// The FSM is fully functional\nfsm.transition(\"fetch\");  // → LOADING\nfsm.transition(\"resolve\"); // → SUCCESS\n```\n\nThis enables **diagram-driven development**: design your state machine visually first, then parse it into a working FSM.\n\n### Roundtripping\n\nYou can export an FSM to Mermaid and parse it back:\n\n```typescript\nconst fsm2 = FSM.fromMermaid(fsm.toMermaid());\n```\n\n**Note:** Guards and actions become placeholder functions when parsing from Mermaid (since diagrams only capture structure, not logic). Lifecycle hooks (`onEnter`/`onExit`) are also not preserved.\n\n### Generating TypeScript Code (`toTypeScript`)\n\nFor a complete workflow where you design visually and implement in code, use `toTypeScript` to generate ready-to-paste TypeScript with TODO placeholders:\n\n```typescript\nimport { toTypeScript } from \"@marianmeres/fsm\";\n\nconst tsCode = toTypeScript(`\nstateDiagram-v2\n    [*] --> IDLE\n    IDLE --> LOADING: fetch\n    LOADING --> SUCCESS: resolve [guard hasData]\n    LOADING --> ERROR: reject\n`);\nconsole.log(tsCode);\n```\n\nOutput:\n```typescript\ntype States = \"IDLE\" | \"LOADING\" | \"SUCCESS\" | \"ERROR\";\ntype Transitions = \"fetch\" | \"resolve\" | \"reject\";\ntype Context = { /* TODO: define your context */ };\n\nconst config: FSMConfig<States, Transitions, Context> = {\n\tinitial: \"IDLE\",\n\t// context: () => ({ /* TODO */ }),\n\tstates: {\n\t\tIDLE: {\n\t\t\ton: {\n\t\t\t\tfetch: \"LOADING\",\n\t\t\t},\n\t\t},\n\t\tLOADING: {\n\t\t\ton: {\n\t\t\t\tresolve: {\n\t\t\t\t\ttarget: \"SUCCESS\",\n\t\t\t\t\tguard: (ctx) => true, // TODO: [guard hasData]\n\t\t\t\t},\n\t\t\t\treject: \"ERROR\",\n\t\t\t},\n\t\t},\n\t\t// ... rest of states\n\t},\n};\n```\n\nThis is useful for **diagram-driven development**: design your state machine visually, generate the TypeScript skeleton, then implement the guards and actions.\n\nYou can automate this process even further by combining deno task with optional `pbcopy`. For example:\n\n```json\n{\n    \"tasks\": {\n        \"mermaid-to-typescript\": \"deno run -A jsr:@marianmeres/fsm/mermaid-to-typescript\"\n    }\n}\n```\n\nAnd then:\n\n```sh\ndeno task mermaid-to-typescript --infile my/file.mermaid | pbcopy\n```\n\n### Complex Diagram Support\n\nThe parser handles real-world Mermaid diagrams with visual annotations:\n\n```typescript\nconst fsm = FSM.fromMermaid(`\nstateDiagram-v2\n    direction LR\n\n    %% Traffic Light Controller\n    %% Author: Your Name\n\n    [*] --> RED\n\n    state \"Stop\" as RED\n    state \"Go\" as GREEN\n\n    RED --> GREEN: timer\n    GREEN --> RED: timer\n\n    classDef danger fill:#f00\n    class RED danger\n\n    note right of RED: Vehicles must stop\n`);\n```\n\nYAML frontmatter, comments (`%%`), styling (`classDef`, `class`), notes, directions, and state aliases are gracefully ignored during parsing, extracting only the structural information needed to build the FSM.\n\n## Transitions\n\nTransitions execute synchronously following a strict lifecycle order: `onExit` (current state) → `action` (transition edge) → `onEnter` (target state). This design isolates \"edge-specific\" side effects from general state initialization logic. \n\nThe FSM also supports **internal transitions** (defined without a target), allowing you to execute actions and update context without triggering state changes or lifecycle hooks.\n\n### Internal vs. External Transitions\n\n* **External Transition (Re-entry):** If `target` is defined, the FSM executes: `onExit` → `action` → `onEnter`. Use this to \"reset\" a state.\n* **Internal Transition:** If `target` is omitted, the FSM executes **only** the `action`. Lifecycle hooks are skipped. Use this for side effects without re-initialization.\n\n```typescript\nconst fsm = new FSM({\n    states: {\n        PLAYING: {\n            onEnter: () => console.log('Started'),\n            onExit: () => console.log('Stopped'),\n            on: {\n                // External: triggers onExit -> Action -> onEnter\n                restart: { target: 'PLAYING' },\n\n                // Internal: triggers action ONLY (no exit/enter logs)\n                volumeUp: {\n                    action: (ctx) => ctx.volume += 1\n                }\n            }\n        }\n    }\n});\n```\n\n### Self-Loop Transitions and Infinite Loops\n\n**Self-loop transitions** (where the target state equals the current state) are valid FSM semantics. When a self-loop occurs, the full lifecycle executes: `onExit` → `action` → `onEnter` → notify subscribers. This is useful for retry logic, refresh patterns, or re-initialization.\n\nHowever, be cautious when calling `transition()` from within a subscriber callback. Since notifications are synchronous, transitioning to the same state (or any state that leads back) can cause an infinite loop:\n\n```typescript\n// ⚠️ DANGER: This will cause an infinite loop!\nfsm.subscribe(({ current }) => {\n    if (current === \"LOADING\") {\n        fsm.transition(\"refresh\"); // If \"refresh\" targets \"LOADING\" again...\n    }\n});\n```\n\n**Prevention patterns:**\n\n1. **Check for actual state changes:**\n```typescript\nfsm.subscribe(({ current, previous }) => {\n    // Only react to actual state changes, not self-loops\n    if (current !== previous) {\n        fsm.transition(\"someEvent\");\n    }\n});\n```\n\n2. **Use guards to prevent repeated transitions:**\n```typescript\n{\n    on: {\n        refresh: {\n            target: \"LOADING\",\n            guard: (ctx) => !ctx.isRefreshing,\n            action: (ctx) => ctx.isRefreshing = true\n        }\n    }\n}\n```\n\n3. **Use internal transitions** when you only need to run an action without re-entering the state:\n```typescript\n{\n    on: {\n        // No target = internal transition, no onExit/onEnter, but still notifies\n        updateData: { action: (ctx) => ctx.data = fetchedData }\n    }\n}\n```\n\n## Wildcard Transitions\n\nUse the wildcard `\"*\"` to define a fallback transition. Specific transitions always\ntake priority. The wildcard is consulted in two cases:\n\n1. The current state has no specific handler for the event.\n2. The current state has a specific handler but all its guards rejected.\n\nCase 2 makes wildcards work as a safety net: even when a specific transition's\nguards refuse, the wildcard can rescue the event.\n\n```typescript\nconst fsm = new FSM({\n    initial: \"IDLE\",\n    states: {\n        ACTIVE: {\n            on: {\n                stop: \"IDLE\",      // specific transition takes priority\n                \"*\": \"ERROR\"        // wildcard catches everything else\n            }\n        },\n        ERROR: {\n            on: {\n                \"*\": \"IDLE\"         // any event returns to IDLE\n            }\n        }\n    }\n});\n\nfsm.transition(\"stop\");      // → IDLE (specific)\nfsm.transition(\"crash\");     // → ERROR (wildcard)\nfsm.transition(\"anything\");  // → IDLE (wildcard)\n\n// Mermaid diagrams show wildcards as \"* (any)\"\nconsole.log(fsm.toMermaid());\n// Output includes: \"ACTIVE --> ERROR: * (any)\"\n```\n\nWildcards support all transition features including guards and actions:\n\n```typescript\n{\n    on: {\n        \"*\": {\n            target: \"ERROR\",\n            guard: (ctx) => ctx.errorCount < 3,\n            action: (ctx) => ctx.errorCount++\n        }\n    }\n}\n```\n\n## Checking Transition Validity\n\nUse `canTransition()` to check if a transition is valid without executing it. This respects guards and wildcard rules.\n\n```typescript\nif (fsm.canTransition(\"submit\")) {\n    fsm.transition(\"submit\");\n} else {\n    console.log(\"Submit not available in current state\");\n}\n\n// Works with guarded transitions\nconst canRetry = fsm.canTransition(\"retry\", payload);\n```\n\n**Note on Safety:** `canTransition()` is a pure query method that internally clones the context before evaluating guards. This ensures that even if a guard mistakenly mutates context, the actual FSM state remains unaffected.\n\n## Naming Conventions\n\nThe following naming conventions are recommended for clarity and consistency:\n\n- **States**: `UPPERCASE` nouns describing a condition or mode\n  - Examples: `IDLE`, `LOADING`, `SUCCESS`, `ERROR`\n  - States represent \"being\" - what mode the system is in\n\n- **Transitions**: `lowercase` verbs describing an action or command\n  - Examples: `fetch`, `resolve`, `retry`, `reset`\n  - Transitions represent \"doing\" - what causes the state to change\n\nThese conventions make state machines more readable by visually distinguishing states from transitions, and semantically aligning with their nature (nouns for static conditions, verbs for dynamic actions).\n\n## Context and Guards Best Practices\n\n**Guards should be pure functions** that only read context and return a boolean. They should never mutate context.\n\n**Context should contain only data** (no functions). This ensures:\n- Context can be safely cloned (for `canTransition` safety)\n- State is serializable (for debugging, persistence, localStorage)\n- Behavior is predictable and testable\n\n```typescript\n// ✅ Good: Pure guard, data-only context\ntype Context = { attempts: number; maxRetries: number };\nguard: (ctx) => ctx.attempts < ctx.maxRetries\n\n// ❌ Bad: Mutating in guard\nguard: (ctx) => { ctx.attempts++; return true }\n\n// ❌ Bad: Functions in context\ncontext: { count: 0, increment: () => {} }\n```\n\nFor mutations, use **action hooks** (`action`, `onEnter`, `onExit`) which are designed for side effects. For helper functions, define them outside the FSM and pass context as parameters.\n\n## Debug Logging\n\nThe FSM uses `@marianmeres/clog` for debug logging. Debug output is controlled via the clog library's global setting or by providing a custom logger:\n\n```typescript\nimport { createClog } from \"@marianmeres/clog\";\n\n// Enable debug logging globally\ncreateClog.global.debug = true;\n\nconst fsm = new FSM({\n    initial: \"IDLE\",\n    states: { ... }\n});\n```\n\nDebug logging covers FSM creation, transitions, guard evaluations, lifecycle hooks, and reset operations.\n\n### Custom Logger\n\nYou can provide a custom logger implementing the `Logger` interface (from `@marianmeres/clog`):\n\n```typescript\nimport { FSM } from \"@marianmeres/fsm\";\nimport { createClog } from \"@marianmeres/clog\";\n\nconst fsm = new FSM({\n    initial: \"IDLE\",\n    logger: createClog('my-app-fsm'), // see @marianmeres/clog for more\n    states: { ... }\n});\n```\n\n## Configuration Composition\n\nWhen building complex applications, you may need FSMs that share common behavior but differ in certain areas. For example, a data-fetching FSM might optionally support retry logic, or different user roles might enable different state branches.\n\nThe `composeFsmConfig` helper allows you to build FSM configurations from reusable fragments that are merged together at runtime. This helper is completely standalone from the FSM core - it simply produces a valid `FSMConfig` object before it reaches the FSM constructor.\n\n### Motivation\n\n- **Reusability**: Define core state logic once, extend it for different use cases\n- **Conditional features**: Include or exclude entire state branches based on runtime conditions\n- **Separation of concerns**: Keep feature-specific states in dedicated fragments\n\n### Basic Usage\n\n```typescript\nimport { composeFsmConfig, createFsm, type FSMConfigFragment } from \"@marianmeres/fsm\";\n\ntype States = \"IDLE\" | \"LOADING\" | \"SUCCESS\" | \"ERROR\" | \"RETRYING\";\ntype Events = \"fetch\" | \"resolve\" | \"reject\" | \"retry\" | \"reset\";\ntype Context = { attempts: number; maxRetries: number };\n\n// Core fetch flow - always included\nconst coreFetch: FSMConfigFragment<States, Events, Context> = {\n    initial: \"IDLE\",\n    context: { attempts: 0, maxRetries: 3 },\n    states: {\n        IDLE: { on: { fetch: \"LOADING\" } },\n        LOADING: { on: { resolve: \"SUCCESS\", reject: \"ERROR\" } },\n        SUCCESS: { on: { reset: \"IDLE\" } },\n        ERROR: { on: { reset: \"IDLE\" } },\n    },\n};\n\n// Optional retry feature - conditionally included\nconst retryFeature: FSMConfigFragment<States, Events, Context> = {\n    states: {\n        ERROR: {\n            on: {\n                retry: {\n                    target: \"RETRYING\",\n                    guard: (ctx) => ctx.attempts < ctx.maxRetries,\n                },\n            },\n        },\n        RETRYING: {\n            onEnter: (ctx) => ctx.attempts++,\n            on: { resolve: \"SUCCESS\", reject: \"ERROR\" },\n        },\n    },\n};\n\n// Compose based on feature flag\nconst enableRetry = true;\nconst config = composeFsmConfig([coreFetch, enableRetry && retryFeature]);\nconst fsm = createFsm(config);\n```\n\n### Merge Behavior\n\nUnderstanding how fragments merge is important:\n\n| Property | Behavior |\n|----------|----------|\n| `initial` | Last fragment defining it wins |\n| `context` | Shallow-merged by default (configurable) |\n| `states.X.on` | Transitions are replaced by default (configurable) |\n| `states.X.onEnter/onExit` | Configurable via `hooks` option |\n\n### Options\n\n```typescript\ncomposeFsmConfig([...fragments], {\n    hooks: \"replace\" | \"compose\",                // default: \"replace\"\n    context: \"merge\" | \"replace\",                // default: \"merge\"\n    onInitialConflict: \"last-wins\" | \"error\",    // default: \"last-wins\"\n    transitions: \"replace\" | \"prepend\" | \"append\" // default: \"replace\"\n});\n```\n\n- **`hooks: \"replace\"`** (default): Later fragment's hooks override earlier ones\n- **`hooks: \"compose\"`**: All hooks run sequentially in fragment order. Mutations\n  from earlier hooks are visible to later hooks (shared context reference).\n- **`context: \"merge\"`** (default): Shallow-merge context from all fragments. Each\n  fragment's context is deep-cloned before merging so reset produces a fresh tree.\n- **`context: \"replace\"`**: Later fragment's context completely overrides earlier\n- **`onInitialConflict: \"error\"`**: Throws if multiple fragments define different\n  `initial` values. (Renamed from `onConflict` in v3 for clarity — this option only\n  governs `initial`; context, transitions, and hooks have their own knobs.)\n- **`transitions: \"replace\"`** (default): Later fragment's transitions override earlier ones\n- **`transitions: \"prepend\"`**: Later fragment's transitions are prepended (run first)\n- **`transitions: \"append\"`**: Later fragment's transitions are appended (run last)\n\n### Transition Merging with Interceptor Pattern\n\nThe `transitions` option enables powerful composition patterns like authentication gates or confirmation dialogs without tight coupling between fragments:\n\n```typescript\n// Core application flow\nconst coreFetch: FSMConfigFragment<States, Events, Context> = {\n    initial: \"IDLE\",\n    states: {\n        IDLE: { on: { submit: \"PROCESSING\" } },\n        PROCESSING: { on: { resolve: \"SUCCESS\", reject: \"ERROR\" } },\n        SUCCESS: { on: { reset: \"IDLE\" } },\n        ERROR: { on: { reset: \"IDLE\" } },\n    },\n};\n\n// Auth gate - intercepts transitions when not authenticated\nconst authGate: FSMConfigFragment<States, Events, Context> = {\n    states: {\n        IDLE: {\n            on: {\n                submit: {\n                    target: \"LOGIN_REQUIRED\",\n                    guard: (ctx) => !ctx.authenticated,\n                },\n            },\n        },\n        LOGIN_REQUIRED: { on: { login: \"IDLE\", cancel: \"IDLE\" } },\n    },\n};\n\n// With \"prepend\", auth check runs BEFORE the base submit handler\nconst config = composeFsmConfig([coreFetch, authGate], {\n    transitions: \"prepend\",\n});\n\n// Result: When \"submit\" is triggered from IDLE:\n// 1. Auth guard checked first - if !authenticated, go to LOGIN_REQUIRED\n// 2. If authenticated, fall through to base handler → PROCESSING\n```\n\nThis pattern allows fragments to remain independent - the auth fragment doesn't need to know the implementation details of the base fragment.\n\n### Conditional Fragments\n\nFalsy values are automatically filtered out, enabling clean conditional inclusion:\n\n```typescript\nconst config = composeFsmConfig([\n    coreFragment,\n    userIsAdmin && adminFeatures,\n    featureFlags.retryEnabled && retryFeature,\n    debugMode && debugFragment,\n]);\n```\n\n## Per-state Metadata\n\nEach state config accepts an optional `meta?: unknown` field — an arbitrary\npassthrough slot for domain semantics that the FSM itself does not interpret.\nUseful when a layer above the FSM (e.g. a workflow framework) needs to attach\ninformation like \"what kind of node is this\", \"which handler resolves it\", or\n\"what's the timeout\", without polluting `onEnter` / context.\n\n```typescript\ntype NodeMeta = { kind: \"decision\" | \"effectful\" | \"terminal\"; handler?: string };\n\nconst fsm = new FSM<\"check_stock\" | \"place_order\" | \"done\", \"low\" | \"ok\">({\n    initial: \"check_stock\",\n    states: {\n        check_stock: {\n            meta: { kind: \"effectful\", handler: \"checkInventory\" } satisfies NodeMeta,\n            on: { low: \"place_order\", ok: \"done\" },\n        },\n        place_order: {\n            meta: { kind: \"effectful\", handler: \"submitOrder\" } satisfies NodeMeta,\n            on: { ok: \"done\" },\n        },\n        done: { meta: { kind: \"terminal\" } satisfies NodeMeta, on: {} },\n    },\n});\n\nfsm.getCurrentMeta<NodeMeta>(); // { kind: \"effectful\", handler: \"checkInventory\" }\nfsm.getStateMeta<NodeMeta>(\"done\"); // { kind: \"terminal\" }\n```\n\nThe FSM never reads `meta`. It is preserved in the (deep-frozen) config and\npropagated through `composeFsmConfig` with last-write-wins semantics — a\nfragment that omits `meta` does not erase a prior fragment's `meta`.\n\n`getSnapshot()` does **not** include `meta` — it is a config-time concept.\n\n## Persistence / Durable Resume\n\n`getSnapshot()` captures the runtime state of an FSM as\n`{ state, previous, context }`. To resume an FSM at a saved snapshot — for\nexample, in a long-lived workflow that survives process restarts — use\n`FSM.fromSnapshot(config, snapshot)`:\n\n```typescript\n// Persist\nconst snap = fsm.getSnapshot();\nawait db.save(id, snap);\n\n// ... later, possibly a different process ...\n\n// Resume\nconst saved = await db.load(id);\nconst restored = FSM.fromSnapshot(config, saved);\nrestored.transition(\"next\"); // continues exactly where it left off\n```\n\nSemantics:\n\n- **No `onEnter` runs** for the restored state — a snapshot represents an\n  already-entered state; re-running `onEnter` would double-execute side effects.\n  The `onEnter` of that state already fired in the process that wrote the snapshot.\n- **`previous` is preserved.** This is the key difference from\n  `new FSM({ ...config, initial: snapshot.state })`, which would lose `previous`\n  and fire `onEnter` (no, the constructor does not fire `onEnter` — but it\n  cannot set `previous` either).\n- **Validation matches the constructor.** Unknown `snapshot.state` or non-null\n  `snapshot.previous` throws with parity error messages.\n- **`context` is deep-cloned** so external mutation of `snapshot.context` after\n  the call does not leak into the FSM.\n- **Round-trip property:** for any FSM `f`,\n  `FSM.fromSnapshot(f.config, f.getSnapshot()).getSnapshot()` deep-equals\n  `f.getSnapshot()`.\n\n## API Reference\n\nFor complete API documentation including all types, methods, and detailed parameter descriptions, see [API.md](API.md).\n\n## License\n\n[MIT](LICENSE)\n","readmeFilename":"README.md"}