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 🙏

© 2026 – Pkg Stats / Ryan Hefner

@notmrabhi/flowforge

v0.1.66

Published

Schema-driven form renderer and workflow engine for miniOrange IAM

Readme

@miniorange/flowforge

Schema-driven form renderer and workflow builder for miniOrange IAM. Provides a dynamic form engine (FlowForm) and a node-based workflow canvas (WorkflowCanvas) built on ReactFlow, with BPMN import/export.

📋 Form schema reference: FORM.md — field types, validation, conditions, ref API, common patterns.

Proprietary — © miniOrange. All rights reserved. Use is restricted to miniOrange products and authorized integrations.

Installation

npm install @miniorange/flowforge

Peer dependencies

This package expects the host app to provide React, MUI, and a few UI libraries (so versions stay in sync with your app):

npm install react react-dom @mui/material @emotion/react @emotion/styled formik react-icons react-select reactflow

Supported ranges: React ≥17, MUI ≥5, reactflow ≥11 (see peerDependencies in package.json).

Usage

import { FlowForgeCanvas } from '@miniorange/flowforge/canvas';
import { NodeTypeRegistry } from '@miniorange/flowforge/nodes';
import { TemplateRegistry } from '@miniorange/flowforge/templates';
import '@miniorange/flowforge/dist/style.css';

const nodeRegistry = new NodeTypeRegistry();
const templateRegistry = new TemplateRegistry();
// register node descriptors + templates...

export function Builder() {
  return (
    <FlowForgeCanvas
      nodeRegistry={nodeRegistry}
      templateRegistry={templateRegistry}
      canvasOptions={{ branchLayout: 'vertical' }}
      onSave={(workflow) => console.log(workflow)}
    />
  );
}

Loading templates from a backend

Instead of hardcoding templateRegistry.register({...}) calls, fetch templates from your API and bulk-register them. The package accepts the backend wire shape directly via registerFromApi:

import { templateRegistry } from '@miniorange/flowforge/templates';
import type { ApiWorkflowTemplate } from '@miniorange/flowforge/canvas';

async function loadTemplates() {
  const res  = await fetch('/api/v1/workflow-template');
  const list: ApiWorkflowTemplate[] = await res.json();
  templateRegistry.clear().registerFromApi(list);
}

Expected payload shape per row (the backend's persistence model + a templateUI JSON column for UI fields):

{
  "key": "END_USER_CREATION",
  "name": "New User Registration",
  "description": "…",
  "state": "PUBLISHED",
  "allowedTasks":  ["USER_CREATION", "USER_GROUP_ASSIGNMENT", "USER_ROLE_ASSIGNMENT"],
  "allowedSources": ["SIGNUP_FLOW", "ADMIN_CREATION_FLOW"],
  "configuration":  { /* runtime BPMN — ignored by the canvas */ },
  "templateUI": {
    "triggerCategory": "event",
    "icon": "user-plus",
    "tags": ["onboarding"],
    "category": "User Lifecycle",
    "author": "miniOrange",
    "popularity": 100,
    "source": "system",
    "product": "IAM",
    "maxTasks": 10,
    "taskLabels": { "USER_GROUP_ASSIGNMENT": "Assign Groups" },
    "skeletonState": {
      "slots": [ /* CanvasSlot[] — pre-seeded canvas chain */ ],
      "branches": {}
    }
  }
}

registerFromApi normalises allowedTasks → availableTasks automatically. Bad rows (missing key) are skipped with a DEV-mode warning, so a single malformed template doesn't blank the picker.

Entry points

| Import | Contents | | --- | --- | | @miniorange/flowforge | Everything (form + canvas + registries) | | @miniorange/flowforge/form | FlowForm dynamic form renderer | | @miniorange/flowforge/canvas | WorkflowCanvas builder | | @miniorange/flowforge/nodes | NodeTypeRegistry + built-in node types | | @miniorange/flowforge/templates | TemplateRegistry + skeletons | | @miniorange/flowforge/core | Shared core types/utilities | | @miniorange/flowforge/default-ui | Default drawer/picker UI |

Development

npm run demo       # run the demo app (Vite)
npm run build      # typecheck + build dist
npm run typecheck  # tsc --noEmit
npm test           # build + BPMN round-trip tests

License

UNLICENSED — proprietary to miniOrange. Not for redistribution outside authorized use.