{"id":18870375,"url":"https://github.com/streetstrider/machine","last_synced_at":"2026-02-14T17:30:14.823Z","repository":{"id":40202651,"uuid":"506750587","full_name":"StreetStrider/machine","owner":"StreetStrider","description":"strongly typed finite-state machine","archived":false,"fork":false,"pushed_at":"2022-09-09T01:38:32.000Z","size":28,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":3,"default_branch":"master","last_synced_at":"2024-12-30T23:47:23.176Z","etag":null,"topics":["state-machine","typescript"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/StreetStrider.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2022-06-23T18:30:49.000Z","updated_at":"2022-09-09T01:20:38.000Z","dependencies_parsed_at":"2023-01-17T16:46:52.917Z","dependency_job_id":null,"html_url":"https://github.com/StreetStrider/machine","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/StreetStrider%2Fmachine","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/StreetStrider%2Fmachine/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/StreetStrider%2Fmachine/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/StreetStrider%2Fmachine/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/StreetStrider","download_url":"https://codeload.github.com/StreetStrider/machine/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":239816509,"owners_count":19701755,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["state-machine","typescript"],"created_at":"2024-11-08T05:19:53.660Z","updated_at":"2026-02-14T17:30:14.774Z","avatar_url":"https://github.com/StreetStrider.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# machine\n\nMy approach on a strongly typed finite-state machine. Simple design, strong guarantees, both type guards and asserts for a running machine.\n\n```ts\nimport { Schema }  from 'machine'\nimport { Machine } from 'machine'\n\nconst schema = Schema()\n.state('init', () =\u003e { /* enter init */ }, () =\u003e { /* leave init */ })\n.state('running', (id: number) =\u003e ({ id }))\n.state('stopped')\n.path('init', 'running')\n.path('running', 'running')\n.path('running', 'stopped')\n\nconst machine = Machine(schema, 'init')\nmachine.is('init')    // → true\nmachine.is('running') // → false\n\nmachine.go('running', 1001)\nmachine.is('running') // → true\nmachine.key   // → 'running'\nmachine.state // → { id: 1001 }\n\nmachine.go('running', 1002)\nmachine.go('running', 1003)\n\nmachine.go('stopped')\n\nif (machine.is('running')) {\n\tmachine.state // will be refined to proper type\n}\nfunction machinery (machine: Machine\u003cany\u003e) {\n\tmachine.must('running') // will throw if in wrong state\n\tmachine.state // will be refined to proper type\n}\n```\n\n## license\nISC, © Strider, 2022.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstreetstrider%2Fmachine","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fstreetstrider%2Fmachine","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstreetstrider%2Fmachine/lists"}