reactflow

    React Flow compatible flow-diagram engine and React host implemented in MoonBit.

    reactflow
    flow
    diagram
    graph
    react
    Download zip
    Author
    Version
    0.1.1
    License
    Apache-2.0
    Last updated
    4 days ago
    Downloads
    15

    No dependencies

    #ReactFlowMBT

    React Flow 流程图引擎与 React 宿主的 MoonBit 实现。几何、图模型和无 DOM 交互状态机用 MoonBit 编写并可独立测试;浏览器通过编译后的 JS 模块调用引擎。运行时依赖只有 React 和 React DOM,上游 @xyflow/react@12.12.0、@xyflow/system@0.0.83 仅用于开发期数值对照。

    #项目目标

    • 用 MoonBit 实现可复用的流程图核心:边路径几何、图变更与查询、交互状态机。
    • 提供稳定的 JSON 文本边界,让任意 JS/TS 宿主(本项目附带 React 宿主)复用同一套行为。
    • 用共享场景目录和上游数值夹具约束行为,保证与 React Flow 的兼容性可验证、可回归。

    #功能特性

    包职责
    geometry五种边路径、包围盒、视口、可见性、标记、边与矩形相交
    graph不可变变更、查询、删除范围、父子坐标、extent
    interaction单步交互状态机、点击连线、重连、缩放、键盘及自动平移步长
    jsapiJSON 文本接口,编译到 _build/js/debug/build/jsapi/jsapi.js

    React 宿主支持受控/非受控节点与边、ReactFlowProvider、useReactFlow、useStore、自定义节点与 Handle、内置节点/边类型、NodeResizer、NodeToolbar、Panel、MiniMap、Background、Controls。

    #环境要求

    • MoonBit 工具链:moonc >= 0.10.16(本项目验证使用 moon 0.1.20261028 / moonc 0.10.18)。
    • Node.js 22 + npm(仅运行 React 宿主、单元测试和端到端测试时需要)。

    #安装

    从 mooncakes.io 添加模块:

    moon add 2d5rrr333/reactflow

    或在 moon.mod 中声明依赖:

    import { "2d5rrr333/reactflow@0.1.1", }

    #快速开始:MoonBit

    下面的最小样例演示节点变更、边路径计算和拖拽交互,可直接运行:

    moon run cmd/main

    fn main {
    let nodes = [
    @graph.FlowNode::at("a", 0.0, 0.0),
    @graph.FlowNode::at("b", 240.0, 120.0),
    ]
    let edges = [@graph.FlowEdge::between("a", "b", "a-b")]
    let nodes = @graph.apply_node_changes(
    nodes,
    [@graph.NodeChange::Position(id="a", x=40.0, y=60.0, dragging=false)],
    )
    println("node a: (\{nodes[0].x}, \{nodes[0].y})")
    let path = @geometry.bezier_path(
    @geometry.Point::{ x: 100.0, y: 80.0 },
    @geometry.Right,
    @geometry.Point::{ x: 300.0, y: 200.0 },
    @geometry.Left,
    0.25,
    )
    println("edge path: \{path.path}")
    let editor = @interaction.Editor::fresh(nodes, edges)
    let step = @interaction.pointer_down(
    editor,
    40.0,
    60.0,
    0,
    "",
    false,
    false,
    "",
    )
    println("mode after pointer down: \{step.editor.mode}")
    }

    示例源码见 cmd/main/main.mbt。

    #快速开始:React 宿主

    # 1. 构建 MoonBit JS 模块 moon build --target js # 2. 安装宿主依赖并启动演示 npm ci --prefix host npm run dev --prefix host

    import { ReactFlow, Background, Controls, MiniMap } from "./host/src" export function Editor() { return ( <ReactFlow defaultNodes={[ { id: "a", position: { x: 40, y: 60 }, data: { label: "Start" }, width: 100, height: 40 }, { id: "b", position: { x: 300, y: 160 }, data: { label: "End" }, width: 100, height: 40 }, ]} defaultEdges={[{ id: "a-b", source: "a", target: "b", type: "smoothstep" }]} > <Background /> <Controls /> <MiniMap /> </ReactFlow> ) }

    演示通过 ?scenario=browser-node-drag 选择场景;也可以选择 browser-connect、browser-resizer、browser-zoomed-drag、browser-zoomed-resize。完整目录见 conformance/scenarios.json。

    #测试与持续集成

    moon check --deny-warn moon test --deny-warn moon build --target js --deny-warn

    仓库根目录的 scripts/verify.sh 是完整的本地验证入口,依次执行 MoonBit 检查与测试、JS 构建及边界驱动、TypeScript 检查、Vitest、演示构建、运行时上游包名扫描、Playwright 端到端测试和场景覆盖核对:

    bash scripts/verify.sh

    CI 配置见 .github/workflows/verify.yml,覆盖 moon check、moon test、JS 构建、边界驱动、React 宿主的类型检查与单元测试。行为验收合同位于 openspec/,共享场景与数值夹具位于 conformance/。

    #许可证与上游来源

    本项目采用 Apache-2.0 许可证。上游参考项目 React Flow(@xyflow/react、@xyflow/system)使用 MIT 许可证,仅作为开发期行为对照和数值夹具来源;本项目不复制其运行时代码。详见 conformance/README.md。

    Source Files