Skip to content

Commit ecbaf36

Browse files
committed
fix(ui): 重名检测不再走原型链
终局全分支评审发现(Minor,控制方直接修并自证): `if (merged[name])` 会走原型链,名为 constructor 的图标(命名规范 /^[a-z][a-z0-9-]*$/ 恰好放行) 即使毫无重名也会因取到 Object.prototype.constructor 而抛「图标重名」——误导性的启动期崩溃。 改为 Object.prototype.hasOwnProperty.call(merged, name)。不用 Object.hasOwn:它是 ES2022, 而本仓 lib 为 ES2020。 探针自证(真实模块):临时插入一个名为 constructor 的图标 -> 模块正常导入(9 用例中 8 个照跑), 唯一失败是「恰好 24 个」的名单计数;若为旧代码,导入期即抛错、9 个用例全灭。逐字节还原后 21/21。 门禁:tsc exit 0 · 全量 103 files / 809 tests exit 0。
1 parent 7cbf555 commit ecbaf36

1 file changed

Lines changed: 5 additions & 1 deletion

File tree

‎app/src/ui/icons/paths.ts‎

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,11 @@ function mergeGroups(): Record<string, IconGeometry> {
2727
const merged: Record<string, IconGeometry> = {};
2828
for (const [groupName, group] of Object.entries(GROUPS_FOR_MERGE)) {
2929
for (const [name, geometry] of Object.entries(group)) {
30-
if (merged[name]) {
30+
// 必须用 hasOwnProperty 而非 `merged[name]` 真值判断:后者会走**原型链**,于是名为
31+
// `constructor` 的图标(命名规范 `/^[a-z][a-z0-9-]*$/` 恰好放行)即使毫无重名,
32+
// 也会因取到 `Object.prototype.constructor` 而抛「图标重名」—— 误导性的启动期崩溃。
33+
// 不用 `Object.hasOwn`:它是 ES2022,而本仓 `lib` 为 ES2020。
34+
if (Object.prototype.hasOwnProperty.call(merged, name)) {
3135
// 重名会让「哪个几何生效」取决于对象键顺序 —— 静默且难以定位,故直接拒绝
3236
throw new Error(`图标重名:${name}(分组 ${groupName} 与其它分组冲突)`);
3337
}

0 commit comments

Comments
 (0)