Skip to content
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
This repository was archived by the owner on Nov 4, 2026. It is now read-only.

console + runner: 17 ESLint errors that were never seen, incl. 12 React-correctness bugs #2927

Closed

Description

@os-zhuang

Split out of #2923 so the CI wiring can land without bundling runtime-behaviour changes.

apps/console and packages/runner had no lint script, so turbo run lint skipped them silently. They carry 17 ESLint errors — error severity under the repo's own eslint.config.js, not warnings — that nobody has ever seen. They are parked in DEBT in scripts/check-lint-coverage.mjs until fixed.

apps/console — 14 errors

react-hooks/purity x8 — impure call during render

Date.now() called during render in ApprovalsInboxPage.tsx at lines 1397, 1399, 1400, 1401, 1601, 1605 (+2 more).

Cannot call impure function during render. Date.now is an impure function.

Render must be pure — an impure call makes output depend on when React happens to render, which breaks under StrictMode double-render, concurrent re-render, and the React Compiler's memoisation assumptions. A relative-time display computed this way silently disagrees with itself across renders.

Fix shape: hoist the timestamp out of render — compute in an effect/event and hold it in state, or pass it in — rather than reading the clock mid-render.

react-hooks/static-components x4 — component created during render

  • apps/console/src/pages/settings/SettingsField.tsx:222
  • apps/console/src/pages/settings/SettingsHub.tsx:46
  • apps/console/src/pages/settings/SettingsView.tsx:161
  • apps/console/src/pages/system/ApprovalsInboxPage.tsx:1585

Cannot create components during render. Components created during render will reset.

This is the user-visible one. A component defined inside render is a brand-new type every render, so React unmounts and remounts it: local state is lost, inputs lose focus mid-typing, animations restart. Three of the four are Settings pages — i.e. forms, where state loss is most noticeable. Worth checking whether any known Settings flakiness traces to these.

Fix shape: hoist the component to module scope and pass what it needs via props (or useCallback a render function rather than defining a component).

2 minor

  • apps/console/src/lib/auth-preflight.ts:39 — no-useless-assignment: the value assigned to token is never used in subsequent statements. Worth a look rather than a blind delete: a dead assignment on an auth path can mean an intended write went missing.
  • apps/console/src/sdui-workbench-preview.tsx:25 — prefer-const on store.

packages/runner — 3 errors

react-hooks/static-components x3 in LayoutRenderer.tsx at 70, 106, 168 — same class as console's.

Suggested order

The two static-components clusters are the same fix applied in two places and the highest value — start there. purity is contained to one file. The 2 minor ones are trivial but auth-preflight deserves a real read.

Closing this out

@object-ui/console (14) and @object-ui/runner (3) are listed in DEBT in scripts/check-lint-coverage.mjs. Per package: fix the errors, add "lint": "eslint .", then delete the DEBT entry — the guard fails if an entry outlives its gap and will remind you to close this issue.

Note these are pre-existing, not a regression — they were simply invisible. The gate added in #2923 does not turn them red; it declares them.

Refs #2911, #2923

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions