@krizaka/audit

中文文档
0.1.6发布于 2026/11/01Apache-2.0TypeScriptES Module构建来源已验证

对于每个Krizaka产品,谁做了什么:在自己的模式中只添加审计跟踪,写在调用者的事务中或悄悄地在它旁边,为管理员过滤,为Loi 25导出和编辑,在管理员设置保留后清除。没有达

中文使用文档

@krizaka /审计

谁做了什么,为每一个克里扎卡产品。 trail是只能追加的,并且存在于产品的数据库中,在Postgres模式中 audit.

  • 两种写法: 在调用者的事务内部(它与工作一起提交或回滚),或静静地在它旁边(记录失败,从不抛出)。
  • 对于管理员: 过滤和分页。
  • Loi 25: 导出并编辑。
  • 保留: 在保留管理集后清除。

没有数据库客户端,也没有挂钟:您传递了一个 Query 和一个 Clock.

pnpm add @krizaka/audit @krizaka/db

将其模式添加到您的迁移中

模式嵌入到 @krizaka/db,按你自己的顺序:

import { emitMigration } from "@krizaka/db";
import { auditSchema } from "@krizaka/audit";

// commit the output as one of your migrations (drizzle-kit `generate --custom`, or your list)
emitMigration(auditSchema, 1, { tables: { owner: "accounts" } });

这张桌子是 audit.entry. 它持有的时间,演员(指你) accounts, ON DELETE SET NULL)、可读标签、带点的动作(billing.checkout_started)、可选目标、详细信息(jsonb)和IP。

使用

import { createAudit } from "@krizaka/audit";
import { transaction } from "@krizaka/db";

const audit = createAudit({ clock: { now: () => new Date() }, onError: (e) => logger.warn(e) });

// Inside a unit of work: the entry exists only if the work commits.
await transaction(connect, async (tx) => {
  await suspendUser(tx, userId);
  await audit.record(tx, { actorId: admin.id, actorLabel: admin.name, action: "admin.user_suspended", target: { type: "account", id: userId } });
});

// Beside it: never fails the request.
await audit.recordQuietly(query, { actorId: null, actorLabel: "stripe webhook", action: "billing.event_ignored", detail: { type } });

// The admin's view: newest first, filtered, paged by cursor.
const page = await audit.list(query, { actionPrefix: "admin.", limit: 50 });
const next = await audit.list(query, { actionPrefix: "admin.", limit: 50, before: page.at(-1)?.id });
  • 25法则:

    • exportFor(query, accountId) 给出该人的条目;
    • redactActor(tx, accountId) 保留事实并删除人:id和IP变为空,标签变为“擦除”。

    输入尽可能少的个人信息 detail 根据行动需要。

  • 保留: 注册 auditSettings 在你的 @krizaka/settings 注册表(audit.retentionDays:默认为1095天,30-3650天)。你的工作需要你 audit.purge(tx, { retentionDays }).

  • 来自请求的输入以相同的方式检查每个存储: 页面大小必须是一个正整数(上限为200),游标必须是一个条目id, IP必须是一个地址,保留期必须在设置的范围内(30-3650天),所以错误的值永远不会清除整个跟踪。每一次拒绝都是一次 AuditError 具有稳定的代码(AUDIT_BAD_FILTER, AUDIT_BAD_IP, AUDIT_BAD_RETENTION……)。

  • 固定的动作列表: createAudit({ allowedActions: [...] }) 拒绝其他任何东西(AUDIT_UNKNOWN_ACTION)。

  • 另一个商店 运行合同工具包: auditStoreContract 从 @krizaka/audit/testkit. memoryAuditStore() 是参考。

版本与发布记录

@krizaka/audit 共发布 8 个版本,首次发布于 2026/10/24;过去 12 个月发布了 8 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
0.1.6latest2026/11/011 天前
0.1.52026/10/295 天前
0.1.42026/10/277 天前
0.1.32026/10/277 天前
0.1.22026/10/268 天前
0.1.12026/10/268 天前

关于 @krizaka/audit 的常见问题

@krizaka/audit 是什么?

对于每个Krizaka产品,谁做了什么:在自己的模式中只添加审计跟踪,写在调用者的事务中或悄悄地在它旁边,为管理员过滤,为Loi 25导出和编辑,在管理员设置保留后清除。没有达

如何安装 @krizaka/audit?

在项目目录运行 npm install @krizaka/audit,或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖:zod(>=3.23)。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖,Yarn 需要手动安装。

@krizaka/audit 支持 TypeScript 吗?

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

@krizaka/audit 支持 ESM 还是 CommonJS?

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

@krizaka/audit 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js >=22。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

@krizaka/audit 可以商用吗?

@krizaka/audit 使用 Apache-2.0 许可。宽松许可:允许商业使用、修改和再分发,并附带明确的专利授权;分发时需保留许可与 NOTICE 文件,修改过的文件要注明改动。以上为概括,不构成法律意见,请以许可原文为准。

@krizaka/audit 还在维护吗?

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