@ ai- matrx/ diff
完整的AI Matrx diff产品:两个纯引擎外加回放取景器 建在他们身上.
-
@ai-matrx/diff/react整个UI.DiffViewer(核心 其他一切组成),TextDiff, (中文(简体) ),DiffReview(平时合并),InlineTextDiff, (中文(简体) ),AnimatedDiffReveal,以及结构化实体查看器DiffViewerShell与 它的场适配器。 没有图标库,没有UI工具包,没有编辑器依赖性. -
下面的引擎是纯粹的逻辑,零依赖性,没有DOM,没有在 导入时间 :
-
@ai-matrx/diff/text——行级LCS文本 diff. 一个计算输出两个 统一inline)并相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相rows() 说明,包括字/字级 在已更改的行配对上突出显示段并显示将 diff 转换为 unk 模式 接受/拒绝合并工具. -
@ai-matrx/diff/structural通用树/阵列结构diff。 深潜 二 纯对象被打入每字段可插入的身份密钥的已打的更改节点树 用于阵列匹配.
词根( E)@ai-matrx/diff再出口两个引擎. /react 是一个单独的
子路径,所以一个没有头的消费者 从不支付UI.
npm install @ai-matrx/diff
反应查看器
import { DiffViewer, DiffReview } from "@ai-matrx/diff/react";
// Read-only. Fills its container: render it as a route, a window, a modal, a
// sheet, or any region of a page.
<DiffViewer
original={a}
modified={b}
engine="auto" // "auto" | "light" | "monaco"
language="typescript" // drives auto selection; omit for prose/markdown
originalLabel="Before"
modifiedLabel="After"
defaultView="split" // "split" | "inline" | "highlight"
/>
// Merge. Every hunk is pending / applied / rejected; Apply hands back the text.
<DiffReview original={a} modified={b} onApply={(merged) => save(merged)} />
视图 : split (边接边接), inline (统一), highlight (单页-
页:1 新设 仅以已改变的区域有锡
读者取景,不是代码diff. 未更改上下文折叠为几行
每跑一次更改并扩展; 前置/ 下一次在更改之间跳出; 互换翻转
哪一边是基线。 diff是计算ONCE,所以解析,扩展
和导航 永远不再运行 LCS.
结构(实体)
import { computeDiff } from "@ai-matrx/diff/structural";
import {
DiffViewerShell,
createAdapterRegistry,
TextFieldAdapter,
TagsFieldAdapter,
} from "@ai-matrx/diff/react";
const adapters = createAdapterRegistry();
adapters.register("instructions", TextFieldAdapter);
adapters.register("tags", TagsFieldAdapter);
<DiffViewerShell
diffResult={computeDiff(oldRecord, newRecord)}
oldValue={oldRecord}
newValue={newRecord}
oldLabel="v3"
newLabel="v4"
adapters={adapters}
temporalMetadata={dates} // optional per-side / per-field provenance
/>
没有注册适配器的字段返回到软件包的
DefaultFieldAdapter - 从来没有下降。 证明行是明确的
他们不知道(装入或无法使用),从不取代全记录的
缺少字段日期的时标.
Styling——代号合同
组件只通过语义符号词汇来消耗颜色
(单位:千美元)--card, (中文(简体) ), --muted-foreground, (中文(简体) ), --border, (中文(简体) ), --primary, (中文(简体) ), --success, (中文(简体) ),
--destructive(中文(简体) ). 两个主机步骤:
/* Tailwind v4: compile the package's utilities. */
@source "../node_modules/@ai-matrx/diff/dist";
// Fresh app with no token vocabulary of its own — gives every token a
// sensible light/dark value. Apps that already define the AI Matrx tokens
// must NOT import this.
import "@ai-matrx/diff/styles.css";
红色-去除-去除-去除-去除-去除-去加绿色-去除-去除-去除-去除-去除-去除-去除-去除-去除-去除-去取-去除-去除-去除-去除-去取-去取-去取-去取-去取-去取-去取-去取-去取-去取-去取-去取-去取-去取-去-去取-取-取-去-取-取-取-去-取-取-取-去-取-取-取-去-取-取-取-取-取-取-去-取-取-取-取-取-取-用是故意的,非自 (d) 其他一切——表面, 边框、 文本、 填充 —— 遵循主机的符号.
一个注射接缝:一个重(代码编辑器)渲染器
该套件不包含代码编辑依赖性. 登记一和 DiffViewer
路由源代码和对它的大量输入 :
import { setHeavyDiffRenderer, MONACO_DIFF_EDITOR_OPTIONS } from "@ai-matrx/diff/react";
setHeavyDiffRenderer(MyMonacoDiff); // once, at module scope
由于没有登记,轻引擎使一个完整的diff——即:
工作默认,而不是站立。 只有一个 明确 engine="monaco" 那个
无法被尊重是退化的, 它在工具栏和通过
onEngineResolved。 。 。 .
文本引擎
import { computeTextDiff, applyHunks } from "@ai-matrx/diff/text";
const diff = computeTextDiff("the quick fox\nsecond line", "the slow fox\nsecond line");
diff.stats; // { additions: 0, deletions: 0, modifications: 1, unchanged: 1 }
diff.inline; // unified view: one entry per line per side (removed, then added)
diff.rows; // split view: one aligned row per pair, left/right cells
diff.rows[0].left.segments;
// word-level highlights on the modified pair:
// [{ type: "unchanged", value: "the " }, { type: "removed", value: "quick" },
// { type: "unchanged", value: " fox" }]
diff.whitespaceOnly; // true when only whitespace differs
// Merge tool: accept/reject hunks, get the merged text back.
// Accept-all === modified, accept-none === original — exactly.
applyHunks(original, modified, [0, 2]); // accept hunks 0 and 2, keep the rest old
行为说明: 在同一变换区块中的去除/添加行 修改
(配对至少相近25%时带有线内段);投入太大,无法
密集的LCS基质安全地降解为整块取代OOMing;
ignoreTrailingWhitespace 是一个显示选项 — hunk/ 相现模型总是 diffs 原始
线条可以精确地合并圆行字节. maxLcsCells 收紧矩阵盖.
另有两行读取共用相同的受限对齐:
import { computeLineChanges, analyzeTextChange } from "@ai-matrx/diff/text";
// A code editor's "+N −M": an edited line is one deletion plus one addition.
const { additions, deletions, lines } = computeLineChanges(before, after);
// A sync conflict's content-loss reading (who holds lines the other lacks,
// lines/chars changed, whitespace/blank-line/trim-only flags, merged segments).
const a = analyzeTextChange(local, remote, { maxLcsCells: 250_000 });
a.modifiedHasContentOriginalLacks; // keeping `local` would lose remote's lines
在盖子上方保留了共同的前缀和后缀,并将已更改的中间读作一体
移除了块,然后增加了一个块,然后说 degraded: true。 。 。 .
结构引擎
import { computeDiff, filterChangesDeep } from "@ai-matrx/diff/structural";
const result = computeDiff(
{ title: "Old", items: [{ id: "a", qty: 1 }, { id: "b", qty: 2 }] },
{ title: "New", items: [{ id: "b", qty: 2 }, { id: "a", qty: 5 }] },
{ identityKeys: { items: "id" } }, // or (item, index) => string
);
result.hasChanges; // true
result.stats; // { added, removed, modified, unchanged, total }
result.root; // DiffNode tree: title modified; items modified with children:
// "a" modified (qty 1 → 5), "b" reordered
filterChangesDeep(result.root); // prune everything unchanged
行为说明: 默认忽略对象密钥顺序( 选择通过
orderSensitiveObjectPaths; 下划线前缀的密钥在默认情况下进行比较—— schema
合同密钥如 __kind 数据(skipUnderscorePrefix: true 是一个明确的选入
演示文稿过滤器); 多样数组([{...}, "str"]永不
抛出 — 错配的对是修改过的叶子; 当配置的身份密钥不是时
独有的,引擎会回到无损失的位置匹配,而不是静默
投放项目; excludePaths 将空名取为根字段或点出路径
被窝住的.
diffRecordFields(prior, next, rowChange) 是一行的顶级读取
写入, 对于行历史时间表: 插入 / 删除 / 更改字段, 一个 JSON 列
整体变化(平等是: === 或匹配 JSON.stringify键序
计算)和a "insert" 或者说 "delete" 以插入或
删除.
设计
- 纯引擎,具有匹配类型声明的双重无害环境管理/CJS,经核查
装入后装入弹丸
import财务报告和审定财务报表require编辑/react块携带"use client"边框; 引擎 输入时故意不这样做, 因此它们在 React Server 内保持合法 构成部分。 柏球门检查双向. - 两台引擎在渲染过程中运行愉快;每条四相径被封住并被降解 而不是扔或吊.
- 整个严格类型 :
exactOptionalPropertyTypes, (中文(简体) ),noUncheckedIndexedAccess无any。 。 。 . react编号 :react-dom(仅限)/react需要他们.
许可证
麻省理工学院
审查会议
DiffReview 要求每个汉克在应用前被接受或拒绝。 对a
主机所属会话, 从 @ai-matrx/diff/text,通过 session 还有一个
onTransition 减小边界; 否则通过 original 财务报告和审定财务报表 modified 页:1
源键内部会话。 设定 disabled 当主机等待.