Skip to content

术语表 ​

只回答「这个词在本仓指什么」。 结构与「东西该放哪」见架构地图, 决策理由见 ADR,命令见仓库根 AGENTS.md。

2026-09-23 从仓库根 CONTEXT.md 搬到这里(评审 §6 的「术语表」层)。搬的原因:那份文件 与本节文档讲的是同一批包,已经漂移过一次(它曾把已更名的 @walnut/axios 当作现存包)。 现在根 CONTEXT.md 只留一个指针。

仓库结构与分组 ​

术语在本仓指什么
外层 / 内层外层 = pnpm workspace 里的 workspace 包(apps/* + packages/**);内层 = apps/server/libs/* 那批 NestJS 内部库(按依赖方向分六层,层序见「内部 lib」条目),不是 workspace 包,走 tsconfig paths 解析
platform-any运行时无关的共享包组:contract · types · utils-core。可被前端与后端同时消费
platform-web浏览器 / Vue 包组:api-types · client · http · ui。源码直消费、不构建
tooling工具链包组(6 个):tsconfig · eslint-config · commitlint-config · vitest-config · scripts · release
内部 libapps/server/libs/ 下的内部库,按依赖方向分六层:基建 → 技术 → identity 内核 → 领域域(system → auth → security)→ 装配(guards)→ app-domain。排序靠前者被靠后者 import(下层在前,反向 import 即违规);guards 是装配层,在全部领域域之上,app-domain 再依赖 guards。层序由 apps/server/eslint.config.ts 的分层规则机械守,完整清单以目录为准。namespace @walnut-server/*,与 workspace 包物理分离(ADR 0007 / 0022)
组合根(composition root)装配依赖、决定进程形态的入口。apps/api 是默认部署单元;apps/worker(cron + Bull,可选)与 apps/cli(migration / OpenAPI,零运行时)是同一 workspace 内的可选组合入口,不是新服务(ADR 0022)
目录名 ≠ 包名最典型的是 packages/platform-any/utils-core/ —— 它的包名是 @walnut/utils,utils-core 只是目录名
boundary tag各包 workspace 级 turbo.json 里声明的标签(app / platform-any / platform-web / platform-node / tooling / shared / backend …),由 turbo boundaries 强制依赖方向;shared 不得依赖 app、platform-any 不得依赖 platform-web/platform-node、backend 不得依赖 platform-web

包 ​

术语在本仓指什么
@walnut/contract构成前后端 API 契约的共享类型与常量:响应码 / 响应信封、枚举、分页、菜单与角色常量、locale、HTTP headers、路由常量。单一真源,有快照测试守护(ADR 0004)
@walnut/utils平台无关的纯函数:regex、queue、crypto 原语、持久化增强。前后端都消费;因为后端要 CJS 消费,不能引 Vue/DOM(ADR 0006)
@walnut/types纯 ambient 类型声明(universal / storage / deep-ref / object-key),零运行时。子路径 @walnut/types/<name> 与根导出 @walnut/types 都可用
@walnut/client仅浏览器的代码:Web Crypto 封装、文件工具、window 帮助函数、持久化存储、Vue composables、store 工厂。源码直消费,无构建
@walnut/http基于 Axios 的 HTTP 客户端框架:instance、拦截器、适配器(cache / retry / throttle / cancel / merge)。原名 @walnut/axios(2026-07 更名)
@walnut/ui基于 naive-ui 的组件。目前只有 3 个(Switch / DynamicTags / TimePicker),迁移仍在进行(见待办表的「@walnut/ui 剩余组件」)
@walnut/tsconfig纯 JSON 的 tsconfig 预设:base / ts / vue,按运行环境而不是「项目 vs 库」分(ADR 0019)
@walnut/scripts仓库级脚本的通用层:lib/(纯逻辑,供其它工具包复用)、ci/(仓库门禁)、env/(加解密),以及若干 bin。只导出 lib/*,ci/ 与 env/ 刻意不导出
@walnut/release发版编排(src/release/),唯一 bin 是 walnut-release(根 pnpm release)
@walnut/vitest-config共享 Vitest 预设:只收敛用例发现规则 / 运行环境 / 覆盖率采集范围三件事

机制与约定 ​

术语在本仓指什么
catalogpnpm-workspace.yaml 的 catalog: 段 —— 依赖版本的唯一书写处。catalogMode: strict 下包内只能写 "catalog:"
workspace:*workspace 内部引用的唯一写法(syncpack 强制)
双模式消费同一个包经 exports 条件同时服务两端:"source" 给 Vite 读源码,"require" 给后端读 CJS 产物(ADR 0002)
JIT / 源码直消费exports 直接指向 .ts 源码,由消费方的打包器编译,没有构建步骤。platform-web/* 与 @walnut/types 属于这一类(ADR 0005)
barrel / 选择性 barrel包入口的 index.ts。ADR 0013 规定包入口用显式具名 re-export,export * 一次都不用;app 代码则不建 barrel
意图(intent)一次发版的版本变更声明。pnpm change 写、pnpm version -r 消费;文件仍是 changesets 格式(.changeset/*.md)
ledger.changeset/ledger.yaml —— 意图的消费台账。「哪些意图已经被消费」的判据始终是它,不是文件在不在
fixed 组versioning.fixed 里的单一组:全部 workspace 包永远同版本,因此 tag vX.Y.Z 永远有唯一来源(ADR 0008 / 0011)
电池(release battery)发版前必跑的聚合门禁表,定义在 packages/tooling/release/src/release/steps.ts
可擦除语法Node 24 原生剥离类型只支持的写法:没有 enum、没有非 ambient namespace、没有构造函数参数属性、没有 import =。由 @walnut/tsconfig/ts.json 的 erasableSyntaxOnly 在编译期保证(ADR 0019)
@pseudo文档里有意写不合法的伪代码块,把 // @pseudo 放在块的第一行即可豁免 pnpm lint:doc-ts
冻结语料content/archive/ 与 content/industry-research/:有意保留当时样子的历史文档,不参与死链、路径引用、代码块校验

纪律(原根 CONTEXT.md 的 Rules) ​

  1. 共享包不做环境相关默认值。 工具函数收参数,由调用方决定 dev/prod 行为。
  2. 共享包里不写 import.meta.env / process.env。 那是 app 层的事。
  3. 直接消费 @walnut/contract。 不加包装层 —— 直接从源码 import 类型与常量(ADR 0004)。
  4. private: true 的包只被本仓源码消费。 CJS 构建产物只为后端消费而存在。

上面前三条由 pnpm lint(ESLint 预设里有对应规则)与 ADR 约束;第 4 条是约定 —— 它意味着 「private 字段的缺失不代表要发布到 npm」,见架构地图的消费方式一节。

基于 MIT 许可发布