Uh oh!
There was an error while loading. Please reload this page.
chore(lint): 清掉 ESLint 自己报的 49 条失效 eslint-disable 指令 (#4833) - #4849
Conversation
…unused (#4833) Every site was taken from ESLint's own `ruleId: null` report — `Unused eslint-disable directive (no problems were reported from 'X')` — so which directive to touch was never a judgement call. 49 directives across 35 files in 17 packages. Comment lines only: 60 deletions, 1 insertion. The single modified line is apps/console/src/pages/developer/PublicFormsPage.tsx:151, where the directive sat inline inside a statement, so only the comment was stripped and the useEffect call is byte-identical. Counts reconcile on two independent surfaces (repo-root `eslint . -f json` over 3177 files, and the `turbo run lint` the workflow actually runs): warnings 9828 -> 9779 (-49, one per directive), errors 0 -> 0, unused directives 49 -> 0. Per-rule diffing shows no other rule's count moved in either direction — had any directive still been load-bearing, removing it would have surfaced the rule it was suppressing. Twenty sat on `no-console`, which the config sets to `error` (the #4029 ratchet); they were dead because that rule is configured with `allow: ['warn', 'error']` and the calls beneath are console.warn/console.error, or because the file matches the `'no-console': 'off'` override. Four are the ones PR #4844 turned stale by adding `varsIgnorePattern: '^_'`. Co-authored-by: Claude <noreply@anthropic.com>
✅ Console Performance Budget
📦 Bundle Size Report
Size Limits
|
yinlianghui
commented
Aug 16, 2026
【PM 验收 · ACCEPT】objectui 分片 PM(session_01GTRjn8xBqp75dk7kFupVRt),#4833 失效 eslint-disable 全量清理。 实物核验:36 文件 +24/-60,除 changeset 外全为注释行删除(numstat 亲读,唯一代码触碰是 PublicFormsPage 剥行内注释、调用逐字节未变);eslint.config.js 与 releases 零触碰;分支零模型标识;在飞 PR 文件面四方交叉核查零交叠。 CI 终态(PM 亲读):head 889e2cb 全部 19 项 completed、零 failure。首轮 Build & E2E 的 14 秒失败被 dev 按纪律先取完整日志定性(corepack/undici 在 验收要点(记账):
跟进处置: 处置:undraft + auto-merge(SQUASH)。 Generated by Claude Code |
Uh oh!
There was an error while loading. Please reload this page.
Fixes#4833
Refs #4844, #4806, #4029
做了什么
删掉全仓 49 条已失效的
eslint-disable指令,分布在 17 个包的 35 个文件里。判据全程只用 ESLint 自己的报文,零主观判断:取仓根
pnpm exec eslint . -f json里ruleId为null的那些 message —— 它们不是任何一条规则的报告,而是 ESLint 自己的Unused eslint-disable directive (no problems were reported from 'X')。哪一条该动、动哪一行,全部由这份报文点名,我没有自己判断过任何一条指令"看起来多余"。
改动只有注释行。 35 个文件合计 60 删 1 增,唯一那 1 行"增"是把一条写在语句内部的行内指令
剥掉注释、保留代码本身(见下面的 B 类),
useEffect调用逐字节未变。前后对账(两条互相独立的口径,数字一致)
origin/main@815cad03d)ruleId: null)口径一是仓根
eslint . -f json(3177 个文件);口径二是lint.yml实际跑的turbo run lint(47/47 tasks,TURBO_EXIT=0),两者都得 9779 / 0 error / 0 条失效指令。减少数与删除数逐条吻合:49 条指令、warning 恰好减 49。
最强的一项证据:除了失效指令这一类,没有任何一条规则的计数发生变化
逐 rule 对账修前修后的完整计数表,结果是只有
(unused-directive)这一行动了(49 → 0),其余每一条规则前后完全相同,既没有新增、也没有减少:
这正是"这些指令确实是死的"的判据:只要有任何一条指令其实还在压着东西,删掉它就会让被压的规则冒出来。
一条都没冒出来。
逐条处置表
修法三选一,实际只用到两类,如实说明另一类为 0:
C 类为 0 是实测结论,不是漏做
逐条解析了 49 条指令的规则名列表,没有一条列了一个以上的规则(49 条全部是单规则指令),
所以"一条 disable 列多规则、只摘掉多余那个"这种修法在本仓根本没有适用对象。
D 类为 0 的验证方式
每条删除后都重跑并逐 rule 对账,若某条指令其实不是失效、而是 ESLint 的误报,删掉它必然让原规则冒出来。
上面那张"其余规则一条没动"的表就是这项检查的结果:0 条需要按 D 类回退。
其中 20 条压的是 error 级棘轮
no-console,若有一条判错,error会立刻从 0 变正数 —— 实测仍是 0。为什么这 49 条是死的(机制,不是"eslint 说的")
不是逐条猜,而是每一类都有配置层面的成因:
no-console20 条 ——eslint.config.js把它配成['error', { allow: ['warn', 'error'] }]。这 20 条底下的调用全是
console.warn/console.error(规则本来就放行),或者所在文件命中'no-console': 'off'的 override(**/*.test.*、**/__tests__/**等)。规则从一开始就没打算报它们。@typescript-eslint/no-unused-vars4 条 —— 正是 PR fix(lint): honour the_prefix convention in no-unused-vars (#4835) #4844 补上varsIgnorePattern: '^_'之后转为多余的那 4 处手写豁免,站点与 fix(lint): honour the
_prefix convention in no-unused-vars (#4835) #4844 回报的清单逐条对上(45 → 49 的那 4 条)。eqeqeq4 条 /no-alert1 条 /no-await-in-loop1 条 —— 这几条规则本仓压根没有启用(不在
js.configs.recommended里,配置也没开),压一条没开的规则自然永远是多余的。react-hooks/exhaustive-deps10、no-constant-condition3、no-new-func2、react-hooks/set-state-in-effect2、react-hooks/static-components1、no-explicit-any1)属于代码本身变了、被压的问题已不存在。
两条"错位指令":删对了,但值得单独说
有 2 条的失效原因不是"问题没了",而是指令写错了位置,从来就没生效过 ——
eslint-disable-next-line的"下一行"落在了另一条注释或空行上:
apps/console/src/pages/developer/PublicFormsPage.tsx:151react-hooks/exhaustive-deps目前在 151 行本行照常报着packages/react/src/SchemaRenderer.tsx:238no-explicit-any目前在 240 行照常报着对这两条我只做删除,没有"顺手挪到正确位置"。挪位置会让两条现存 warning 被新压制下去 —— 那是抑制
语义的变更,不属于本卡"清理失效指令"的范围,该不该压制是另一个判断。删除后这两条 warning 原样保留
(它们本来就在 9779 里,不是本 PR 新增的)。已按纪律另行留档,交 PM 分诊。
另有
packages/app-shell/src/views/RecordDetailView.tsx:1968同样是错位(下一行是 5 行说明性注释),但它的依赖数组本来就是全的、没有 warning 可压,所以删掉它没有任何遗留。
反向验证(先写预判,再跑;已先 commit 再变异,不提交)
方向说明:本卡不是"还原修复 → 钉子变红",硬套那个模板会是假证据。 理由先写在前面:
本 PR 删除的东西本身就是那条诊断,没有任何测试断言"这些指令不存在";裁判是 ESLint 自己的
Unused eslint-disable directive报文。所以把删掉的指令加回去,是重新造出一条 warning,不是让什么变红。又因为
lint.yml有意不设--max-warnings、门禁只看 error,所以两个状态下 error 都必须是 0 ——error 一旦不为 0,说明我删错了,而不是说明验证成功。
变异内容:挑 2 条已删的加回去,分别代表两个最值得钉的子类。
packages/core/src/actions/ActionEngine.ts:75no-console['error', { allow: ['warn', 'error'] }],底下是console.warn—— 规则本来就放行。钉的是"20 条压 error 级棘轮"那一类packages/plugin-view/src/ObjectView.tsx:712@typescript-eslint/no-unused-varsvarsIgnorePattern: '^_'已覆盖_kanbanColumns等名字。钉的是 #4844 转出来的那 4 条三项全中,且重新出现的两条正是加回去的那两个站点(报文逐字对上)。
其中
error仍为 0 这一项是实打实的断言,不是走形式:如果那条no-console指令其实还在压着东西,把它加回去、再删掉时
no-console就会以 error 身份冒出来 —— 那正是"D 类例外"的判据。实测 error 恒为 0,说明这 20 条压在 error 级棘轮上的指令,删除是安全的。
验证完已
git checkout还原,工作树与 commit 逐字节一致(git diff HEAD为空)。测试与门禁
注释删除理论上零行为变化,整包测试是防"手滑删错行"的兜底。
受影响 17 个包整包测试(仓根路径过滤跑法,按 AGENTS.md §9):
pnpm exec vitest run --maxWorkers=2 apps/console/ packages/app-shell/ … packages/react/退出码 0,零失败。(输出里几条
ECONNREFUSED 127.0.0.1:3000是某个测试去够后端的既有噪音,与本改动无关,不影响结果。)
type-check:仓根
pnpm exec turbo run type-check --concurrency=2→81 successful, 81 total,退出码 0。lint:仓根
pnpm lint(即turbo run lint)→47 successful, 47 total,TURBO_EXIT=0,0 error。control bytes:
node scripts/check-control-bytes.mjs→ OK(扫描 4335 个文件);另按纪律做了超出门禁扫描面的自查grep -naP '[\x00-\x08\x0b\x0c\x0e-\x1f]',改动文件全部干净。changeset:实测判定,不是照惯例推断。
node scripts/check-changeset-presence.mjs修前退出 1(35 个文件全部落在 17 个发版包的
src/下),因此必须补一个;本改动纯注释、零用户可见变化,按 AGENTS.md §9 写空 frontmatter 显式声明"不发版",门现输出:
✅ … declares 1 changeset(s) … Every one of them has an EMPTY frontmatter — declared as releasing nothing。check-changeset-no-major.mjs亦通过。边界自查
eslint.config.js。issue 正文提到的"顺手把reportUnusedDisableDirectives设成 error 关门"不在本 PR,那是独立决策(会改变门禁强度),留给 PM 分诊。本 PR 只做清理,清理后该项恰好为 0,
正是关门的前置条件已具备。
content/docs/releases/;未 force-push。与本 PR 的 35 个文件零交叠(docs(layout): guide/layout.md 教真实的 SidebarNav,并按实现改写 Responsive Behavior (#4840, #4842) #4848 只动
content/docs与packages/layout;chore(deps): raise the @objectstack/* pin from ^17.0.0-rc.6 to 17.0.0 GA #4639 / chore(deps): bump motion from 12.43.0 to 13.1.0 #4093 只动package.json与 lockfile;chore: release packages #4655 是发版 PR)。无需跳过任何文件。附:49 条逐条清单(按被压制的规则分组)
未特别标注的即 A 类「删整条」。
no-console— 20 条packages/app-shell/src/layout/ContextSelectors.tsx:354packages/app-shell/src/views/metadata-admin/createConformance.test.ts:86packages/app-shell/src/views/metadata-admin/createConformance.test.ts:88packages/app-shell/src/views/metadata-admin/createConformance.test.ts:90packages/app-shell/src/views/metadata-admin/previews/PreviewShell.tsx:118packages/core/src/actions/ActionEngine.ts:75packages/core/src/actions/ActionRunner.ts:1155packages/core/src/actions/ActionRunner.ts:1159packages/core/src/utils/column-identity.ts:137packages/core/src/utils/filter-tokens.ts:144packages/i18n/src/i18n.ts:78packages/plugin-calendar/src/ObjectCalendar.tsx:453packages/plugin-calendar/src/ObjectCalendar.tsx:548packages/plugin-charts/src/__tests__/chart-type-spec-parity.test.tsx:81packages/plugin-detail/src/RelatedList.tsx:461packages/plugin-detail/src/RelatedList.tsx:484packages/plugin-detail/src/RelatedList.tsx:557packages/plugin-form/src/EmbeddableForm.tsx:314packages/react/src/SchemaRenderer.tsx:80packages/react/src/SchemaRenderer.tsx:91react-hooks/exhaustive-deps— 10 条apps/console/src/pages/developer/PublicFormsPage.tsx:151packages/app-shell/src/views/RecordDetailView.tsx:1968packages/app-shell/src/views/metadata-admin/ResourceEditPage.tsx:894packages/components/src/renderers/form/form.tsx:711packages/plugin-charts/src/AdvancedChartImpl.tsx:706packages/plugin-chatbot/src/elements/prompt-input.tsx:693packages/plugin-detail/src/DetailSection.tsx:438packages/plugin-detail/src/RelatedList.tsx:605packages/plugin-form/src/MasterDetailForm.tsx:219packages/plugin-grid/src/ObjectGrid.tsx:1125@typescript-eslint/no-unused-vars— 4 条packages/components/src/renderers/action/action-bar.tsx:126packages/mobile/src/__tests__/responsive-config-spec-parity.test.ts:56packages/plugin-view/src/ObjectView.tsx:712packages/react/src/__tests__/SchemaRenderer.propsResolution.test.ts:55eqeqeq— 4 条packages/core/src/evaluator/SafeExpressionParser.ts:347packages/core/src/evaluator/SafeExpressionParser.ts:349packages/core/src/validation/validators/object-validation-engine.ts:282packages/core/src/validation/validators/object-validation-engine.ts:288no-constant-condition— 3 条packages/core/src/evaluator/SafeExpressionParser.ts:314packages/core/src/evaluator/SafeExpressionParser.ts:444packages/providers/src/UploadProvider.tsx:334no-new-func— 2 条apps/console/src/pages/settings/SettingsView.tsx:39packages/react-runtime/src/index.tsx:36react-hooks/set-state-in-effect— 2 条packages/fields/src/widgets/ObjectField.tsx:37packages/fields/src/widgets/ObjectField.tsx:42react-hooks/static-components— 1 条packages/components/src/__tests__/action-bar.test.tsx:409no-await-in-loop— 1 条packages/core/src/utils/chart-series.ts:1035no-alert— 1 条packages/plugin-grid/src/ImportWizard.tsx:1482@typescript-eslint/no-explicit-any— 1 条packages/react/src/SchemaRenderer.tsx:238Generated by Claude Code