@fuaran-ui/ops (英语)
Canonical-JSON 编码器(编码器+结构解码器)和树-op应用引擎用于
fuaran UI 线条格式——符合性 类型脚本主机 会 议 日 程 和 议 程
语言中性合同
fuaran-dotnet/docs/WIRE_FORMAT.md,兄弟关系
F#主持人. 建于打入的形状
@fuaran-ui/schema (同龄人依赖).
npm install @fuaran-ui/ops @fuaran-ui/schema
这是什么
这个 正确性 typeScript 参考执行的层. @fuaran-ui/schema
给您打入的树; 此软件包将生成 TS 授权树 符合电线的 —— 说
它可以被序列化,坚持,重放,并与F#级交换
字节取出. 对照工作空间验证端到端
wire-format-fixtures/ 实体:每个有效的固定
与 F# 编码器同为圆形字节, 每个拒绝的固定面
同样的 DecodeErrorCode 在同一个JSON路径.
API 密码
import { encodeNode, decodeNode, encodeOp, decodeOp, apply } from '@fuaran-ui/ops';
import type { TreeOp, DecodeError, ApplyError } from '@fuaran-ui/ops';
// Encode (typed tree → canonical JSON string)
const json: string = encodeNode(node);
// Decode (canonical JSON string → storage-shape Node<unknown> | DecodeError)
const decoded = decodeNode(json); // Result<Node<unknown>, DecodeError>
if (decoded.ok) {
/* decoded.value : Node<unknown> */
}
// TreeOp codec
const opJson = encodeOp(op);
const op = decodeOp(opJson); // Result<TreeOp<unknown>, DecodeError>
// Apply a tree-op (→ new tree + telemetry | ApplyError)
const result = apply(tree, op); // ApplyResult<TMsg>
if (result.ok) {
/* result.value.newTree, result.value.emittedTelemetry */
}
三个模块
| 模块 | 作用 |
|---|---|
encode | F 对称端口# CanonicalJson 编码器。 决定性,字节稳定输出. |
decode | F号港# JsonDecode 解码器。 结构, Result- 返回,六个错误代码. |
apply | F#应用引擎端口. 原子( E)Batch),还原-误入,发出遥测. |
DecodeError 代码(WIRE FORMAT.md §6)
INVALID_JSON, (中文(简体) ), MISSING_FIELD, (中文(简体) ), WRONG_TYPE, (中文(简体) ), UNKNOWN_DU_CASE, (中文(简体) ), WRONG_NODE_KIND, (中文(简体) ),
EMPTY_NODE_ID - 与F#解码器代码的字节相同,浮出水面 $- 固执
虚道.
安置助手
placeOp 编号 : moveOp 编号 : nudgeOp 编号 : canPlace (加上克隆动词)
duplicateOp 编号 : pasteOp 联合国 …With 采用可注射的变体
fresh-id strategy)获得一个节点的操作 立场 —— 说
首先,最后,在某名兄弟之前或之后——从无姿势行动
词汇.
import { placeOp, moveOp, nudgeOp, canPlace, apply } from '@fuaran-ui/ops';
// Insert `child` immediately before sibling "b" under parent "left".
const r = placeOp(tree, child, {
parentId: 'left',
placement: { kind: 'Before', anchor: 'b' },
}); // Result<TreeOp, PlaceError>
if (r.ok) apply(tree, r.value);
这些帮助者只释放已存在的 TreeOp 形状 - 一个赤裸的 InsertChild 编号 :
MoveNode 当附加已生成通缉令时, 否则
Batch [InsertChild|MoveNode, ReorderChildren],以及 ReorderChildren 一个人
给一块石头。 没有新的行动 无线格式变化任意
他们发出编码,解码, 并完全应用 就像一个消费者组装
是手写的 预检查镜像应用引擎自身的拒绝( 缺席 或
无子父母,自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出
帮助者拒绝和申请拒绝总是同意的;不是其中的锚
拒绝目的地儿童入境(UnknownAnchor而不是沉默无声
附录。 克隆动词重映相撞 在整个横行中
插入前表面, 因此重复或粘贴从不遍及全树
重复编号检查 .
存储形状去除
解码是 存储形状已去除: 总是产量 Node<unknown> 编号 : TreeOp<unknown>, (中文(简体) ),
因为电线没有打字'Msg 资料 'Msg 有效载荷及每个
关闭编码为 "<closure>" {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}请看 不透明 Binding.Static 有效载荷
编码器无法解码为字串 "<opaque>"。两个占位符
重新编码到同一哨点, 所以圆通会保持字节平稳; 键入重接
清除的有效载荷是宿主的责任.
遵义是稳定契约
按线条格式 前置对接规则
(单位:千美元)WIRE_FORMAT.md 第11节页:1 NodeKind 编号 : Spec
编号 : TreeOp 编号 : Binding 编号 : Action 案例更新 F# 编码器 + 解码器 + 程序
财务报告和审定财务报表 此 TS 编码 + @fuaran-ui/schema 同样的承诺。 字节平等反对
合同并非只是API不中断.
许可证
阿帕奇2.0 (英语). 见 STABILITY.md 实现地表稳定
声明.