Simple full-featured finite state machine for your project
Find a file
2021-08-20 11:11:15 +03:00
.github/workflows refac: impl more convenient design 2021-08-20 01:32:56 +03:00
.vscode refac: impl more convenient design 2021-08-20 01:32:56 +03:00
dest refac: impl more convenient design 2021-08-20 01:32:56 +03:00
.gitignore chore: remove package-lock 2021-08-20 01:36:48 +03:00
fsm.test.ts chore: change test for actions 2021-08-20 11:11:15 +03:00
fsm.ts refac: impl more convenient design 2021-08-20 01:32:56 +03:00
LICENSE Initial commit 2019-10-11 14:57:31 +03:00
makefile fix: ext in makefile 2021-08-20 01:35:45 +03:00
package.json refac: impl more convenient design 2021-08-20 01:32:56 +03:00
README.md chore: update badges 2021-08-20 01:49:47 +02:00
tsconfig.json refac: impl more convenient design 2021-08-20 01:32:56 +03:00

IT FSM

ci Coverage Status

Simple finite state machine

Installation

npm install --save it-fsm

Usage

import { StateMachineBuilder } from "it-fsm";

enum ProjectStatus {
  Pending = "pending",
  Active = "active",
  Completed = "completed",
  Archived = "archive",
}

const smbProject = new StateMachineBuilder()
  .withStates(Object.values(ProjectStatus))
  .withTransitions([
    [ProjectStatus.Pending, [ProjectStatus.Active, ProjectStatus.Archived]],
    [ProjectStatus.Active, [ProjectStatus.Completed]],
  ]);

async function main() {
  const project1 = { id: 1, status: ProjectStatus.Pending };
  const project2 = { id: 2, status: ProjectStatus.Completed };

  // Build FSM with current project status
  const smForProject1 = smbProject.build(project1.status);
  const smForProject2 = smbProject.build(project2.status);

  console.log(smForProject2.allowedTransitionStates()); // []

  console.log(smForProject1.allowedTransitionStates()); // [active, archived]
  await smForProject1.changeState(ProjectStatus.Active);

  console.log(smForProject1.allowedTransitionStates()); // [completed]
  await smForProject1.changeState(ProjectStatus.Completed);

  console.log(smForProject1.allowedTransitionStates()); // []
}

main();