npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@h-platform/bpm

v0.0.9

Published

light business process state management

Downloads

2

Readme

Simple bpm

This is a library where you can create a business process and manager it.

A business process is a sequesnce of tasks that needs to be completed towards the end of the process.

Tasks are linked together and each task completed the process will go to a new task until no furthers tasks are done.

Design your process

You can use Camunda Modeler to design a process like this example:

Implement your process

You can implement your process by creating business tasks and adding them to the process. A business task receives the taskName, taskType and two functions. The first function should return list of next tasks to be added to current task list in the process. The second function is a gaurd or constraints function it should return a boolean indicating whether this task can be completed based on the current state of the process.

export class BusinessTask {
    constructor(
        readonly taskName: string,
        readonly taskType: TaskType,
        readonly getNextTasks: NextTasksFunc = (process) => [],
        readonly canComplete: TaskConstraintFunc = (process) => true,
    ) { }
}

The above examples can be implemented as follows

import { BusinessProcess, BusinessTask, TaskType } from '@h-platform/bpm';

createRegistrationProcess() {
        return new BusinessProcess([
            'start'
        ], [
            new BusinessTask('start', TaskType.UserTask, 
                () => ['user.verifyEmail']),
                
            new BusinessTask('user.verifyEmail', TaskType.UserTask, 
                () => ['user.fillInvestmentForm']),
                
            new BusinessTask('user.fillInvestmentForm', TaskType.UserTask,
                () => ['user.fillExperienceForm']),
                
            new BusinessTask('user.fillExperienceForm', TaskType.UserTask, 
                () => ['user.fillNeedsForm',]),
                
            new BusinessTask('user.fillNeedsForm', TaskType.UserTask,
                () => [
                    'user.uploadIdentity',
                    'user.uploadPhoto',
                ]),
                
            new BusinessTask('user.uploadIdentity', TaskType.UserTask,
                () => ['admin.approveAccount']),
                
            new BusinessTask('user.uploadPhoto', TaskType.UserTask, 
                () => ['admin.approveAccount'], 
                
            new BusinessTask('admin.approveAccount', TaskType.UserTask,
                () => ['system.sendWelcomeEmail'],
                (process) => {
                    // ensure previous tasks are completed
                    return ['user.uploadIdentity', 'user.uploadPhoto'].every((taskName) => process.completedTasks.includes(taskName)
                }),
                
            new BusinessTask('system.sendWelcomeEmail', TaskType.SystemTask,
                () => []),
        ])
    }

Using the process

the above defined process can be used as follows:

const registrationProcess = createRegistrationProcess();

registrationProcess.start();
console.log(registrationProcess.currentTasks); // ['user.fillInvestmentForm']

registrationProcess.complete('user.fillInvestmentForm');
console.log(registrationProcess.currentTasks); // ['user.fillExperienceForm']

registrationProcess.complete('user.fillExperianceForm');
console.log(registrationProcess.currentTasks); // ['user.fillNeedsForm']

registrationProcess.complete('someRandomTaskName'); // throw taskName not found error
registrationProcess.complete('admin.approveAccount'); // throw taskName not yet active error

registrationProcess.complete('user.fillNeedsForm'); // ok
registrationProcess.complete('user.uploadPhoto'); // ok
registrationProcess.complete('user.uploadIdentity'); // ok
registrationProcess.complete('user.approveAccount'); // ok
registrationProcess.complete('system.sendWelcomeEmail'); // ok, no more active tasks