@7mind.io/baboon

中文文档
0.0.199发布于 2026/11/04BSD-2-ClauseTypeScriptES Module零依赖构建来源已验证近 30 天下载 3381

为JavaScript消费者编译和运行时间捆绑.

中文使用文档
文档目录9 节
  1. 安装
  2. 使用量
  3. 环境
  4. 在网络工作者中运行
  5. API 表面
  6. 装入计划归档
  7. 正在转换信封
  8. 性能优化
  9. 许可证

@ 7mind.io/baboon (韩语)

JavaScript 为 Baboon 编译器和运行时编码器绑定.

Baboon允许您在紧凑的DSL中定义数据模型,生成多种语言的源代码,并用有版本意识的解码器来编码/解码有效载荷.

安装

npm install @7mind.io/baboon

使用量

import { BaboonCompiler } from "@7mind.io/baboon";

const model = `
model example.npm
version "1.0.0"

root data User {
  name: str
  age: i32
}
`;

const inputs = [{ path: "model.baboon", content: model }];

const result = await BaboonCompiler.compile({
  inputs,
  targets: [
    {
      language: "cs",
      generic: {
        generateTests: false,
        generateFixtures: false
      },
      cs: {
        generateJsonCodecs: true,
        generateUebaCodecs: true,
        deduplicate: true
      }
    }
  ],
  debug: false
});

if (!result.success) {
  throw new Error(result.errors?.join("\n") ?? "Compilation failed");
}

const files = { "model.baboon": model };

// Type identifiers follow `<pkg>/<owner>#<name>`, with `:` for top-level types.
const typeId = "example.npm/:#User";

const encoded = await BaboonCompiler.encode(
  files,
  "example.npm",
  "1.0.0",
  typeId,
  JSON.stringify({ name: "Ada", age: 42 }),
  false
);

if (!encoded.success || !encoded.data) {
  throw new Error(encoded.error ?? "Encoding failed");
}

const decoded = await BaboonCompiler.decode(
  files,
  "example.npm",
  "1.0.0",
  typeId,
  encoded.data
);

if (!decoded.success || !decoded.json) {
  throw new Error(decoded.error ?? "Decoding failed");
}

console.log(JSON.parse(decoded.json));

环境

软件包是普通ES模块,没有运行时间依赖性:编译器是单一的 main.js,而它不需要主机提供的全域,所以在节点运行相同的文件,在 浏览器和网络工人.

在网络工作者中运行

一个模型的装入和类型检查是同步的, CPU 绑定: 大型多版本 归档可以让一条线程忙上几秒钟 。 要保持页面响应, 请运行编译器 在网络工人. worker.js 是一个现成的模块-工人条目 connectBaboonWorker 给予主线程的方法与 BaboonCompiler每个返回一个 Promise· ; 主线程从未下载或解析编译器捆绑 :

// baboon.worker.js — the worker's entry, one line:
import "@7mind.io/baboon/worker.js";
import { connectBaboonWorker } from "@7mind.io/baboon/worker-client.js";

// `new Worker(new URL("./x.js", import.meta.url), { type: "module" })` is the form bundlers
// document for emitting a module worker with its dependencies.
const worker = new Worker(new URL("./baboon.worker.js", import.meta.url), { type: "module" });
const baboon = connectBaboonWorker(worker);

const model = await baboon.loadMany({ bytes });                 // runs in the worker
const result = await baboon.decodeEnvelopeLoaded(model, envelope);
await baboon.release(model);                                    // frees it in the worker

没有捆绑器,就把工人指向包裹本身 (单位:千美元)new Worker("/node_modules/@7mind.io/baboon/worker.js", { type: "module" }),或者无论它在哪里 (已送达).

  • 模型留在工人体内;主线有不透明的手柄,只能通过 装入它们的连接,直到 release(model)。 。 。 .
  • 参数和结果被复制到结构组合算法( 不传输) : 呼叫者保持缓冲.
  • 工人一方的失败以同样的信息拒绝电话,如果 工人脚本无法加载或崩溃,待发和后发的电话拒绝.
  • 在另一港口服务(a) MessagePort,节点的 worker_threads),电话 serveBaboon(port) 从 @7mind.io/baboon/worker-server.js 在工人和 connectBaboonWorker(otherPort) 在另一边.

API 表面

  • BaboonCompiler.compile(options) → Promise<{ success, files?, errors? }>
  • BaboonCompiler.load(files) → Promise<BaboonLoadedModel>
  • BaboonCompiler.loadMany({ bytes } | { base64 }) → Promise<BaboonLoadedModel>
  • BaboonCompiler.listTypes(model) → BaboonTypeInfo[]
  • BaboonCompiler.generateRandom(model, pkg, version, idString) → { success, json?, error? }
  • BaboonCompiler.encode(files, pkg, version, idString, json, indexed) → Promise<{ success, data?, error? }>
  • BaboonCompiler.encodeLoaded(model, pkg, version, idString, json, indexed) → Promise<{ success, data?, error? }>
  • BaboonCompiler.decode(files, pkg, version, idString, data) → Promise<{ success, json?, error? }>
  • BaboonCompiler.decodeLoaded(model, pkg, version, idString, data) → Promise<{ success, json?, error? }>
  • BaboonCompiler.encodedEnvelopeLoaded(model, jsonEnvelope, { envelopeVersion, indexed }) → Promise<{ success, data?, error? }>
  • BaboonCompiler.decodeEnvelopeLoaded(model, uebaEnvelope) → Promise<{ success, json?, error? }>
  • BaboonCompiler.cleanupScheme(files, domain, version) 编号 : cleanupSchemeLoaded(model, domain, version) → Promise<{ success, content?, error? }>

load 财务报告和审定财务报表 loadMany 拒绝 Error 其信息从 Loading failed:· ; 模型问题与它们来自的文件(或档案条目)的路径一起列出.

装入计划归档

loadMany 加载一个 schema 归档的每个计划( 常规的 ZIP 文件) *.bsm(中文(简体) ) 在记忆中一起通过与 load,并返回相同的手柄 :

// e.g. written by: baboon --model-dir ./models :scheme --domains="*@*" --zip-output=schemas.bsm
const model = await BaboonCompiler.loadMany({ bytes: new Uint8Array(await response.arrayBuffer()) });
const same = await BaboonCompiler.loadMany({ base64: "UEsDBAoAAAg..." }); // plain base64, not a data: URL

正好通过一个 bytes 联合国 Uint8Array,节点的 Buffer 列入)或 base64 (单位:千美元) 标准字母; 无 data: 前缀,没有空白。 存档合同 :

  • 条目必须存储(方法 0, 什么 baboon :scheme --zip-output 写)或 解缩(方法8, 缩放工具默认写作); 其他方法, 加密和 拒绝ZIP64;
  • 输入路径必须是相对的 /-没有空的分离路径, . 或者说 .. 部分, 后鞭打或驱动前缀,并具有独特性;
  • 目录条目被忽略 ; *.baboon 条目是计划(UTF-8,至少一个); *.bmo 仅可供 include,其路径解决旁边 包括首先输入,然后与归档根相对;拒绝任何其他条目;
  • 已核实CRC-32核对和.

档案在记忆中读取,没有额外的依赖性,在节点和浏览器中都一样.

正在转换信封

生成的运行时间的外观将值包裹在一个命名的顶级信封中 域、版本和类型(docs/spec/codec-envelope.md) (中文(简体) ). encodedEnvelopeLoaded 转弯 jSON信封装入二进制的UEBA; decodeEnvelopeLoaded 反向显示 :

const json = JSON.stringify({ $mv: 1, $d: "example.npm", $v: "1.0.0", $t: typeId, $c: { name: "Ada", age: 42 } });
const bin = await BaboonCompiler.encodedEnvelopeLoaded(model, json, { envelopeVersion: 1, indexed: false });
const back = await BaboonCompiler.decodeEnvelopeLoaded(model, bin.data); // back.json === json
  • 需要两种选择: envelopeVersion 是二进制布局( e)1外观 默认,带有一个相容性约束; 2 两者兼具,而且只能由 当前运行时间), indexed uEBA指数模式(默认为紧凑, false) (中文(简体) ). 二进制输入是自我描述(v1或v2,收缩或索引),因此解码不需要选项.
  • 这是格式转换,而不是迁移:域、版本和完整的类型标识符 (单位:千美元)pkg/:#Name, (中文(简体) ), pkg/ns#Name, (中文(简体) ), pkg/[pkg/:#Adt]#Branch)从输入中取出并保存. 有效载荷与该确切版本一并阅读。 一个比每个装入的版本更新的作者是 只有当其信封证明有效载荷字节与装入的版本相同时才转换 (单位:千美元)$uv,或二进制 v2 minCompat; 二进制 v1 信封无法证明, 被拒绝 .
  • 兼容性边界从已装入的模型中重新计算输出格式: JSON $rv (json-additive)和 二进制 readableMin (前缀-compact / 前缀- any-mode) 承诺 不同的东西, 从来没有复制过。 从模型中计算出的 只有部分域名的分界线是保守的.
  • 错误报告于 error: 不正确或短发的信封, 不支持 metaVersion 或旗帜, 超出顺序, 未知域, 版本或类型, JSON 字段中,该类型不声明,跟踪字节,并值运行时编码器不能 转换( e)any 字段,不含 rt 绘制地图)。 贾森 $mv 也许就是 编号 1 或遗留字符串 "1"或缺席.

性能优化

对于重复操作,一次装入模型并再用. 此跳过每次呼叫的解析和验证步骤 :

// 1. Load model once
const model = await BaboonCompiler.load(files);

// 2. Encode/Decode multiple times efficiently
const encoded = await BaboonCompiler.encodeLoaded(
  model,
  "example.npm",
  "1.0.0",
  typeId,
  jsonPayload,
  false
);

const decoded = await BaboonCompiler.decodeLoaded(
  model,
  "example.npm",
  "1.0.0",
  typeId,
  encoded.data
);

许可证

BSD-2- 标签

版本与发布记录

@7mind.io/baboon 共发布 31 个版本,首次发布于 2025/12/02;过去 12 个月发布了 31 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
0.0.199latest2026/11/043 天前
0.0.1982026/10/2117 天前
0.0.1962026/09/251 个月前
0.0.1952026/07/283 个月前
0.0.1942026/07/243 个月前
0.0.1932026/07/074 个月前

关于 @7mind.io/baboon 的常见问题

@7mind.io/baboon 是什么?

为JavaScript消费者编译和运行时间捆绑.

如何安装 @7mind.io/baboon?

在项目目录运行 npm install @7mind.io/baboon,或使用 pnpm add / yarn add / bun add。

@7mind.io/baboon 支持 TypeScript 吗?

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

@7mind.io/baboon 支持 ESM 还是 CommonJS?

以 ES Module 形式发布,推荐使用 import 引入。在 CommonJS 项目中,Node.js 20.19+ / 22.12+ 可以直接 require() 不含顶层 await 的 ES Module,更早的版本需要改用动态 import()。

@7mind.io/baboon 可以商用吗?

@7mind.io/baboon 使用 BSD-2-Clause 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@7mind.io/baboon 的下载量有多少?

根据 npm 官方下载统计,@7mind.io/baboon 在 2026/10/05 – 2026/11/03 这 30 天内被下载 3,381 次,日均约 113 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@7mind.io/baboon 还在维护吗?

最新版本 0.0.199 发布于 2026/11/04(3 天前);至今共发布 31 个版本,其中过去 12 个月发布了 31 个;首次发布于 2025/12/02。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。