# @fuaran-ui/ops 中文文档

规范地址：https://npmcn.com/package/%40fuaran-ui/ops/

版本：0\.33\.5
npm 元数据更新时间：2026-11-15T00:19:55.513Z
中文译文更新时间：2026-11-15T17:53:01.863Z
软件包许可：Apache-2\.0

本文由上游 README 翻译，可能存在偏差，请结合原文核对 API、命令与配置。版权与许可归原作者所有。

原始 npm 页面：https://www.npmjs.com/package/%40fuaran-ui/ops
原文对照：https://npmcn.com/package/%40fuaran-ui/ops/?lang=original
项目主页：https://github.com/fuaran-ui/fuaran-ts
源码仓库：https://github.com/fuaran-ui/fuaran-ts

## 关键信息（来自 npm 元数据）

- 包体积（解压后）：4.7 MB，9 个文件
- 模块格式：ESM + CJS
- TypeScript 类型：包内自带
- 运行依赖：0 个
- peer 依赖：@fuaran-ui/schema ^0\.28\.1
- 首次发布：2026-07-24T22:40:45.552Z
- 最新版本发布：2026-11-15T00:19:55.184Z
- 近 30 天下载量：2008（2026-10-16 至 2026-11-14，npm 官方下载统计）
- 已发布版本数：28（近 12 个月 28 个）

## 中文简介

Canonical-JSON codec(编码器+结构解码器)和树-op 应用引擎用于 Fuaran UI 线型格式——一个相容的TypeScript主机,语言中性合同用fuaran-dotnet/docs/WIRE FORMAT.md,对照工作区w进行字节校验

## 安装

```sh
npm install @fuaran-ui/ops
```

也可以使用：`pnpm add @fuaran-ui/ops`、`yarn add @fuaran-ui/ops`、`bun add @fuaran-ui/ops`

## README

# @fuaran-ui/ops (英语)

Canonical-JSON 编码器(编码器+结构解码器)和树-op应用引擎用于 fuaran UI 线条格式——符合性 **类型脚本主机** 会 议 日 程 和 议 程 语言中性合同 [`fuaran-dotnet/docs/WIRE_FORMAT.md`](https://npmcn.com/fuaran-dotnet/docs/WIRE_FORMAT.md),兄弟关系 F#主持人. 建于打入的形状 [`@fuaran-ui/schema`](https://npmcn.com/package/%40fuaran-ui/schema/) (同龄人依赖).

```bash
npm install @fuaran-ui/ops @fuaran-ui/schema
```

## 这是什么

这个 _正确性_ typeScript 参考执行的层. `@fuaran-ui/schema` 给您打入的树; 此软件包将生成 TS 授权树 **符合电线的** —— 说 它可以被序列化,坚持,重放,并与F#级交换 字节取出. 对照工作空间验证端到端 [`wire-format-fixtures/`](https://npmcn.com/wire-format-fixtures/) 实体:每个有效的固定 与 F# 编码器同为圆形字节, 每个拒绝的固定面 同样的 `DecodeErrorCode` 在同一个JSON路径.

## API 密码

```ts
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)获得一个节点的操作 **立场** —— 说 首先,最后,在某名兄弟之前或之后——从无姿势行动 词汇.

```ts
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节](https://npmcn.com/fuaran-dotnet/docs/WIRE_FORMAT.md)页:1 `NodeKind` 编号 : `Spec` 编号 : `TreeOp` 编号 : `Binding` 编号 : `Action` 案例更新 F# 编码器 + 解码器 + 程序 **财务报告和审定财务报表** 此 TS 编码 + `@fuaran-ui/schema` 同样的承诺。 字节平等反对 合同并非只是API不中断.

## 许可证

阿帕奇2.0 (英语). 见 [`STABILITY.md`](https://npmcn.com/package/STABILITY.md) 实现地表稳定 声明.

## 常见问题

### @fuaran-ui/ops 是什么？

Canonical-JSON codec\(编码器\+结构解码器\)和树-op 应用引擎用于 Fuaran UI 线型格式——一个相容的TypeScript主机,语言中性合同用fuaran-dotnet/docs/WIRE FORMAT\.md,对照工作区w进行字节校验

### 如何安装 @fuaran-ui/ops？

在项目目录运行 npm install @fuaran-ui/ops，或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖：@fuaran-ui/schema（^0\.28\.1）。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖，Yarn 需要手动安装。

### @fuaran-ui/ops 支持 TypeScript 吗？

支持。包内自带 TypeScript 类型声明（package\.json 声明了 types 入口），安装后即可获得类型提示，无需再安装 @types 包。

### @fuaran-ui/ops 支持 ESM 还是 CommonJS？

同时提供 ES Module 与 CommonJS 入口，import 和 require\(\) 都可以使用，打包工具会自动选择合适的版本。

### @fuaran-ui/ops 可以商用吗？

@fuaran-ui/ops 使用 Apache-2\.0 许可。宽松许可：允许商业使用、修改和再分发，并附带明确的专利授权；分发时需保留许可与 NOTICE 文件，修改过的文件要注明改动。以上为概括，不构成法律意见，请以许可原文为准。

### @fuaran-ui/ops 的下载量有多少？

根据 npm 官方下载统计，@fuaran-ui/ops 在 2026/10/16 – 2026/11/14 这 30 天内被下载 2,008 次，日均约 67 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入，适合横向比较热度，不能直接等同于使用人数。

### @fuaran-ui/ops 还在维护吗？

最新版本 0\.33\.5 发布于 2026/11/15（今天）；至今共发布 28 个版本，其中过去 12 个月发布了 28 个；首次发布于 2026/07/25。发布频率只是参考信号：功能稳定的工具可能很少需要更新，建议结合源码仓库的 issue 和提交记录判断。

