nextcode

2021.8.1 • Public • Published

NextCode

设计思路

NextCode 引擎采用 AST 的思路+SOP 的思想+JSON 的结构进行设计

  • AST:抽象语法树,编译原理中会对对代码进行词法分析、语法分析,形成抽象语法树,引擎直接进行抽象语法树定义,编写业务逻辑
  • SOP:面向服务编程,把所有可执行体:js 函数、http、rpc 包装成一种服务,并且统一为 JSON 入参、出参,这样达到最大程度的数据整合和集成
  • POP:面向插件编程,把功能包装成一个个独立的可视化插件,实现可视化的插件编程
  • JSON:目前最通用的一种数据结构,数据和流程都使用 JSON 来描述,同时也方便图形化操作节点和属性

支持模型

  • 连接模型:使用 next 属性关联,将一系列节点串联起来执行,使用 pipeline 方式执行
  • 嵌套模型:嵌套模型支持子流程的执行,类似于编程语言的大括号{},大括号可以嵌套,if、while、for 等都是可以嵌套的
  • 引用模型:支持节点引用执行,能够实现循环、递归的逻辑
  • 异步模型:执行到一个异步节点时暂停,等待一个事件唤醒再次执行,实现审批流效果

部署说明

使用 webpack 打包,npm publish 发布

使用

node 环境使用

//加载NextCode
var NextCode = require("nextcode/NextCode");

//执行NextCode
var flow = {"package":"nextcode", "plugin":"eval", "service":"add"};
var input = {"x":2,"y":3}

//执行NextCode
var output = new NextCode().execute(flow, input);

//output => {"x":5,"y":2}

chrome 环境使用

<!-- 加载NextCode -->
<script src="https://unpkg.com/nextcode/dist/NextCode.js"></script>

<script>
var flow = {"package":"nextcode", "plugin":"eval", "service":"add"};
var input = {"x":2,"y":3}

//执行NextCode
var output = new NextCode().execute(flow, input);

//output => {"x":5,"y":2}
</scritp>

上下文和插件

插件

由于 node 环境调用 http 的方式和 chrome 环境的方式不一样,所以需要不同环境的插件实现

设置插件实现

//比如注入http的适配器
NextCode.setPluginAdapter({
    "implement": {
        http: {
            httpPost: httpPost,//执行post的函数
            httpGet: httpGet,//执行get的函数
        }
    }
});

这样就可以执行 http.get 和 http.post 节点,同理 node 环境还可以实现 MongoDB 和 MySQL 等数据库插件适配器

节点类型

所有的功能都通过节点来实现,所有的逻辑通过节点与节点之间连线来实现,节点按照从上往下,从左往右的顺序执行。

flow(流程类型)(稳定)

  • start(开始) :开始节点,只允许一个开始启动,只有连出边,没有连入边
  • stop(结束) :结束节点,只有连入边,没有连出边
  • empty(空) :空节点,没有任何逻辑,透传参数
  • sequence(顺序) :流程节点数组按照数组顺序执行,具有相同的入参
  • pipe(管道) :流程节点数组按照数组顺序执行,上一个节点出参是下一个节点的入参
  • switch(分支):根据分支字段,选择节点执行
  • foreach(遍历):遍历入参数组,依次处理
  • loop(次数循环):循环 N 次执行
  • while(条件循环):条件循环
  • break(退出):在循环体中退出

eval(运算类型)(暂定)

  • init(初始化):计算数据初始化
  • assign(赋值运行):变量赋值
  • eval(计算):计算表达式
  • add(加法):x + y
  • sub(减法):x - y
  • mul(乘法):x * y
  • div(除法):x / y
  • mod(取模):x % y
  • pow(平方):x ^ 2

engine(引擎类型)(暂定)

  • info(信息):引擎内部信息
  • mix(混入):混入节点
  • return(返回):返回数据,退出整个流程
  • cache(缓存):相同入参,从缓存中获取
  • delete(删除字段):删除入参中的字段
  • log(日志):输出入参和出参,已经内部状态信息

stack(栈)(暂定)

  • push(入栈):
  • pop(出栈):
  • peak(栈顶元素):
  • reverse(反转):栈内元素反转
  • join(拼接): 数组栈元素拼接在一起
  • int2char: 栈内元素转换(待定)
  • replace: 栈内元素替换
  • mix: 混入

db(数据库)(稳定)

  • query: 查询
  • insert: 插入
  • update: 更新
  • delete: 删除

git(稳定)

  • read: 更新 git,然后读取文件
  • write: 写文件,提交 git
  • delete: 删除文件,提交 git
  • list: 拉取 git,获取指定目录的内容

http(稳定)

  • post: 发出 post 请求

'implement'

  • redis: 执行 redis 命令

节点属性

节点属性分公共属性和节点特有属性,公共属性是所有节点都适用的属性

公共属性

  • type:节点类型(字符串、必填)
  • id:节点 id,引用时使用 id(字符串、必填)
  • "service":节点名称,体现节点功能(字符串、必填)
  • text:节点文本,在流程图节点中展示(字符串、必填)
  • next:下一个执行节点,支持:节点 id、节点、节点数组

特有属性

节点特有的属性,下面依次说明

flow.start(起始节点)

只有一个起始节点

  • subflow:子流程,支持:节点 id、节点、节点数组

flow.stop(终止节点)

允许多个终止节点,不能有连出的边

flow.empty(空节点)

  • subflow:子流程,支持:节点 id、节点、节点数组

flow.sequence(顺序)

把 subflow 中的子节点按照顺序执行,所有子节点有相同入参

  • subflow:子流程,支持:节点 id、节点、节点数组

flow.pipe(管道)

把 subflow 中的子节点按照串行执行,上一个节点的出参是下一个节点的入参

  • subflow:子流程,支持:节点 id、节点、节点数组

flow.switch(分支)

  • subflow:子流程,支持:节点 id、节点、节点数组
  • field:分支的字段,最终会转化为字符串类型值来判断,比如是 boolean 类型,会转化为"true"来判断(支持表达式)(字符串类型,、必填)
  • case:分支节点定义,比如:{"pass":0,"back":1,"default":1},值为 pass 执行第 0 个子流程,back 时,执行第 1 个子流程,其他默认情况执行 1 流程(对象类型、必填)

flow.foreach(遍历)

  • field:字符串类型,指明要遍历的数组,field 对应入参字段必须是数组
  • subflow:子流程,支持:节点 id、节点、节点数组

flow.loop(次数循环)

  • times:整数类型(支持表达式),要循环的次数(默认为 1)
  • field:结果方法 field 字段中,默认为 array
  • subflow:子流程,支持:节点 id、节点、节点数组

flow.while(条件循环)

  • field:循环值,相当于 while(input[field]) {do what}
  • subflow:子流程,支持:节点 id、节点、节点数组

flow.break(退出)

循环体中【sequence、pipe、foreach、while、loop】退出,比如【step1、step2、break、step3】【stepA、stepB】,step3 不执行,其他都执行

  • breakId:跳出到指定的节点

db.query(查询)

查询数据库表数据,入参

  • input
    • table: 表名
    • where: 查询条件
  • output
    • rows: 数据行

db.insert(插入)

  • input
    • table: 表名
    • data: json 数据
  • output
    • 结果透传

db.update(更新)

  • input
    • table: 表名
    • data: json 数据
  • output
    • 结果透传

db.delete(删除)

  • input
    • table: 表名
    • where: json 数据
  • output
    • 结果透传

git.read(读取)

  • input
    • path: json 文件路径
  • output
    • 文件内容

git.write(写入)

  • input
    • path: json 文件路径
    • json: json 数据
  • output
    • message: 成分与否消息

git.delete(删除)

  • input
    • path: json 文件路径
  • output
    • message: 删除结果消息

git.list(列出)

  • input
    • path: json 文件路径
  • output
    • name: 当前路径名称
    • files: 文件名称字符串数组
    • dirs: 目录字符串数组

Package Sidebar

Install

npm i nextcode

Weekly Downloads

12

Version

2021.8.1

License

none

Unpacked Size

607 kB

Total Files

41

Last publish

Collaborators

  • yanchangyou