关于 compat-review
用于审查 es-toolkit compat 层改动是否修复了与 Lodash 的实际差异。它根据 PR 声明或函数名构造对比测试,在改动前后运行并报告结果。
主要功能
- 01提取 PR 声明和目标函数
- 02创建与 Lodash 的对比测试
- 03覆盖声明案例及边界情况
- 04检查修复前后的行为
- 05生成验证报告
适用场景
- 01验证 compat 修复 PR
- 02将指定 compat 函数与 Lodash 对照
- 03发现边界案例中的回归
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ toss/ es-toolkit --skill compat-review安装后在 Claude Code 中输入/compat-review确认已加载。
详细介绍
兼容层审查
验证兼容性 PR 是否确实修复了 lodash 的不一致问题。
输入
$ARGUMENTS — PR 编号(例如 1234)或函数名称(例如 chunk)
工作流
1. 确定目标函数和 PR 声明
PR 编号:
gh pr view {number} --repo toss/es-toolkit --json title,body,files
从 PR 描述和差异中提取:
- 正在修复的兼容函数
- 贡献者声称的不一致之处(预期行为与实际行为)
- 贡献者提供的测试示例
函数名称:阅读函数源码及其规范,了解当前行为。
2. 构建对比测试
在 src/compat/{category}/_compat-review-{fn}.spec.ts 创建一个临时 vitest 测试文件。
import { describe, expect, it } from 'vitest';
import { fn as compatFn } from 'es-toolkit/compat';
import { fn as lodashFn } from 'lodash';
包含两组测试用例:
A. 贡献者声称的示例 — 直接从 PR 描述或测试差异中提取。这些是 PR 声称要修复的用例。
B. 你生成的约 10 个额外边缘用例 — 根据函数签名和 lodash 已知的行为模式生成:
- 空输入:
[]、{}、''、0 - 空值:
null、undefined - 负数/零/浮点数:
-1、0、1.5、NaN、Infinity - 类型强制转换:字符串形式的数字(
'3')、布尔值、混合类型 - 边界情况:单元素数组、超长字符串、深度嵌套对象
- 选择与特定函数相关的用例
每个测试:
it('description', () => {
let lodashResult, compatResult;
let lodashErr: any, compatErr: any;
try {
lodashResult = lodashFn(args);
} catch (e) {
lodashErr = e;
}
try {
compatResult = compatFn(args);
} catch (e) {
compatErr = e;
}
if (lodashErr && compatErr) return; // both throw = consistent
if (lodashErr || compatErr) {
throw new Error(`Behavior mismatch: ${lodashErr ? 'lodash throws' : 'compat throws'}`);
}
expect(compatResult).toEqual(lodashResult);
});
3. 在 PR 更改前运行对比测试
yarn vitest run src/compat/{category}/_compat-review-{fn}.spec.ts
记录哪些测试失败——这些是在主分支上存在的真实不一致问题。
4. 应用 PR 更改并重新运行
gh pr diff {number} --repo toss/es-toolkit | git apply
再次运行相同的测试。确认:
- 贡献者声称的示例现在都能通过
- 额外的边缘用例仍能通过(没有回归)
测试后还原更改:
git checkout -- .
5. 清理
删除 _compat-review-*.spec.ts。
6. 报告
## {fn} — Compat Review
### PR Claim
{What the contributor says they're fixing}
### Verification (BEFORE fix)
| # | Input | lodash | compat | Match? | Source |
|---|-------|--------|--------|--------|--------|
| 1 | ... | ... | ... | MISMATCH | PR example |
| 2 | ... | ... | ... | MATCH | Edge case |
### Verification (AFTER fix)
| # | Input | lodash | compat | Match? | Source |
|---|-------|--------|--------|--------|--------|
### Verdict
- [ ] PR claim is valid (inconsistency confirmed on main)
- [ ] Fix resolves the claimed inconsistency
- [ ] No regressions in edge cases
- [ ] Existing tests still pass
评论
支持 Markdown