@fnndsc/fond

中文文档
0.6.2发布于 2026/11/15MITTypeScriptESM + CJS近 30 天下载 3730

每一层雾都需要的碎片 不论后端是什么 取决于在 @fnndsc 中的任何内容.

中文使用文档
文档目录8 节
  1. 为什么它存在
  2. 里面有什么东西
  3. 使用 Result
  4. 使用错误堆栈
  5. 虚拟文件系统
  6. 一例,谁装就装
  7. 其所坐处
  8. 许可证

@fnndsc/fond (英语)

每一层雾都需要的片段,无论后端是什么:发动机所用的小而通用的基部(@fnndsc/brasa)),会议主办方(@fnndsc/calypso),而后端的自有软件包全部站立.

名字来自厨房,就像其他的堆: 美食之爱 是基地储备 一个厨房 烹饪其他的一切.

npm install @fnndsc/fond

为什么它存在

后端如ChRIS(CUBE)会带来自己的客户和自己的世界. 每个层都需要的棋子,不管后端是什么,都住在这里,而不是后端的套件,所以一个与CUBE无关的地层可以不用加载CUBE(参见 文件/后端中性.adoc) (中文(简体) ).

慈爱的一条规则: 这取决于什么 @fnndscCI对此持怀疑态度(npm run lint:fond) (中文(简体) ). 它唯一的依赖是 chalk,用于列表视图.

里面有什么东西

导出这是什么
Result<T>, (中文(简体) ), Ok, (中文(简体) ), Err, (中文(简体) ), result_isOk, (中文(简体) ), result_isErr明确的成功或失败价值。 一个函数返回 Result<T> 而不是说 T | null,而 TypeScript 将不会让呼叫者读取 .value 直到检查完毕 .ok。 。 。 .
errorStack整个进程的信息堆积起来,报告失败,有上下文隔离的放眼和检查站.
errorStack_configure, (中文(简体) ), errorStack_getAllOfType, (中文(简体) ), StackMessage配置,一个方便阅读器,以及消息类型.
VFSProvider, (中文(简体) ), VFSItem, (中文(简体) ), CpOptions虚拟文件系统的合同:一个挂载,它声称路径前缀和列表,复制和(可选择的)阅读,写作,制作,去掉并重命名在其下;它所列出的项目.
VFSDispatcher向拥有路径的挂载或向倒置方向运行。 它不知道后端:一个后端记录它的挂载并命名它的倒置.
vfsItems_sort按名称、大小、日期或所有者排序列表中的项目,而不更改给出的数组.
grid_render, (中文(简体) ), long_render, (中文(简体) ), size_format作为终端的列表显示: ls电网和 ls -l长相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相.
ListingLook, (中文(简体) ), ItemKindLook, (中文(简体) ), LISTING_CORE_KINDS, (中文(简体) ), LISTING_LOOK_PLAIN一个列表如何显示:核心的种类(文件,文件夹,链接,挂载)和一个后端的旁边,每个后端都有它的长视图标记,一个名字是如何被取色的.
listingItems_sort按一个字段对列表进行排序;一个倒置的排序按项目顺序保持等号.

使用 Result

故障本身没有有效载荷:原因出现在错误堆上,表面可以显示 Result 只说失败了.

import { Ok, Err, errorStack, type Result } from '@fnndsc/fond';

async function config_read(path: string): Promise<Result<Config>> {
  const text: string | null = await file_read(path);
  if (text === null) {
    errorStack.stack_push('error', `No configuration at ${path}.`);
    return Err();
  }
  return Ok(config_parse(text));
}

const config: Result<Config> = await config_read('~/.config/app.yml');
if (!config.ok) {
  // config.value does not exist here; TypeScript says so.
  return;
}
config_apply(config.value);

使用错误堆栈

errorStack 是整个过程的单一实例。 每个消息都印有推动它的函数名称:

errorStack.stack_push('error', 'CUBE refused the login');
errorStack.stack_pop();
// { type: 'error', message: '[login_run                               ] | CUBE refused the login' }

阅读和清除:

方法对
stack_push(type, message)推着一个 error 或一个 warning。 。 。 .
stack_pop(), (中文(简体) ), stack_getAll()取最新消息; 列出全部信息 .
stack_search(text), (中文(简体) ), messagesOfType_search(type, text)查找包含一些文本的信件 .
allOfType_get(type), (中文(简体) ), messages_has(), (中文(简体) ), messagesOfType_has(type)按类型读取;询问是否有什么内容.
stack_clear(), (中文(简体) ), type_clear(type)扩展堆栈,或一种类型.

有两个特征使同时进行的工作不会混淆其错误:

  • 范围. 内部工作 errorStack.scope_run(fn) 由节点公司承载 AsyncLocalStorage 通过每个 await 内在的 背景工作(缓冲变暖,刷新)在范围中运行,因此它的失败永远不会在前台命令的报告中落地.
  • 检点. 命令调用 checkpoint_mark() 在它起作用之前 checkpoint_drain(mark) 之后,得到准确的信息 推入之间.
const mark: number = errorStack.checkpoint_mark();
const answer: Result<Listing> = await listing_fetch(path);
const reasons: StackMessage[] = errorStack.checkpoint_drain(mark);

errorStack_configure({ functionNamePadWidth }) 设定添加函数名印花的宽度.

虚拟文件系统

会话文件系统是一棵由挂载组成的树. 每个挂载(a) VFSProvider) 主张路径前缀和答案,用于它所在或下面的一切;在一段边界匹配的最长前缀获胜,所以 /proc/jobs 优先于 /proc,以及 /procs 没有低于 /proc。没有挂载要求的路径会回到倒计时.

import { VFSDispatcher, type VFSProvider } from '@fnndsc/fond';

const dispatcher: VFSDispatcher = new VFSDispatcher(filesFallback);   // what no mount claims
dispatcher.provider_register(notesMount);                             // prefix '/notes'
dispatcher.provider_register(jobsMount);                              // prefix '/proc/jobs'

await dispatcher.list('/proc');        // the mounts beneath it ('jobs'), beside what the fallback holds there
await dispatcher.read('/notes/today'); // notesMount.read('/notes/today')

每一次挂载操作都因姓名而被拒绝(mkdir: cannot create directory '/x': Read-only file system),从未默默被忽略. 没有倒计时的调度器拒绝任何没有挂载的路径, 而不是用空文件夹回答 . pathResolver_register 添加一个钩子,在倒背者看到它之前将路径映射到倒背者自己的形态;一个无法解决路径的复制会失败而不是猜测. 一个代表倒计时文件夹的挂载( 任务) data 下级 /proc/jobs 工作输出文件夹中是否有此语句 storePath_resolve:它下面的倒行道意味着一条倒行道,或者对于挂载的一条路径来说是无效的. 一个会话问它, 和倒背的链接在答案, 之前,每个读取和列表(brasa's storePath_resolve) (中文(简体) ).

一例,谁装就装

错误堆栈只有在整个进程共享一个时才有效 。 喜欢是建立在普通JS, 所以包 require 它(积分)和包件 import 它(萨尔萨,brasa,calypso) 装入相同的模块,所以是相同的堆. @fnndsc/cumin 再出口的宠物 Result 财务报告和审定财务报表 errorStack 而不是保留复制品, 所以代码从Cumin进口它们 共享堆栈。 如果你捆绑的代码 使用喜欢的, 保存在一个副本.

其所坐处

  brasa (engine)    calypso (session host)    cumin, salsa (the ChRIS backend)
        │                     │                          │
        └─────────────────────┼──────────────────────────┘
                              ▼
                      ┌───────────────┐
                      │     fond      │   depends on nothing in @fnndsc
                      └───────────────┘

许可证

麻省理工学院. 部分 爱。 。 。 .

版本与发布记录

@fnndsc/fond 共发布 12 个版本,首次发布于 2026/10/09;过去 12 个月发布了 12 个版本。

版本发布日期距今
0.6.2latest2026/11/15今天
0.6.12026/11/15今天
0.6.02026/10/2522 天前
0.5.12026/10/2324 天前
0.5.02026/10/2224 天前
0.4.02026/10/1829 天前

关于 @fnndsc/fond 的常见问题

@fnndsc/fond 是什么?

每一层雾都需要的碎片 不论后端是什么 取决于在 @fnndsc 中的任何内容.

如何安装 @fnndsc/fond?

在项目目录运行 npm install @fnndsc/fond,或使用 pnpm add / yarn add / bun add。

@fnndsc/fond 支持 TypeScript 吗?

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

@fnndsc/fond 支持 ESM 还是 CommonJS?

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

@fnndsc/fond 可以商用吗?

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

@fnndsc/fond 的下载量有多少?

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

@fnndsc/fond 还在维护吗?

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