Filed unassigned by the repo:objectui execution seat while working #4611 (session session_012u2pRjcqAYtoEjgr3wwhnK). Observation-class; recorded rather than fixed, because #4611's scope is prose-only.
What
packages/types/src/ui-action.ts:27 imports the type I18nLabel in the import type { ... } from '@objectstack/spec/ui' block. Measured: the identifier appears exactly 4 times in the file — the import at :27 and three occurrences inside the JSDoc prose at :316, :317, :322. There is no type position using it.
It is left over from the local label / options[].label override that objectui#3174-era work removed; those keys now flow in by reference through Omit(z.input(typeof ActionParamSchema), 'type'), so nothing needs the symbol.
Why nothing catches it
Two independent reasons, both measured this session:
noUnusedLocals is off on the path that compiles this package.tsconfig.base.json sets "noUnusedLocals": true, but packages/types/tsconfig.json extends ../../tsconfig.json (the root config), which sets "noUnusedLocals": false. Confirmed the compiler would flag it otherwise: a standalone tsc -p with noUnusedLocals: true over an unused import type reports error TS6196: 'Bar' is declared but never used.- ESLint's rule is a warning with no cap.
eslint.config.js sets '@typescript-eslint/no-unused-vars': ['warn', ...], and per that config's own comment .github/workflows/lint.yml sets no --max-warnings, so it cannot fail CI.
Impact
Zero runtime and zero .d.ts impact — it is a type-only import, erased at emit, and the symbol is not re-exported. This is tidiness plus one small readability cost: a reader of this file sees I18nLabel imported and may reasonably infer the interface still names it somewhere.
Fix shape
Delete I18nLabel, from the import block at :27 and re-run pnpm --filter @object-ui/types type-check and lint. Worth checking at the same time whether tsconfig.base.json's noUnusedLocals: true is intended to reach the packages at all, since nothing that extends the root config gets it — that half may deserve its own card.
Refs #4611.
Filed unassigned by the
repo:objectuiexecution seat while working #4611 (sessionsession_012u2pRjcqAYtoEjgr3wwhnK). Observation-class; recorded rather than fixed, because #4611's scope is prose-only.What
packages/types/src/ui-action.ts:27imports the typeI18nLabelin theimport type { ... } from '@objectstack/spec/ui'block. Measured: the identifier appears exactly 4 times in the file — the import at :27 and three occurrences inside the JSDoc prose at :316, :317, :322. There is no type position using it.It is left over from the local
label/options[].labeloverride that objectui#3174-era work removed; those keys now flow in by reference throughOmit(z.input(typeof ActionParamSchema), 'type'), so nothing needs the symbol.Why nothing catches it
Two independent reasons, both measured this session:
noUnusedLocalsis off on the path that compiles this package.tsconfig.base.jsonsets"noUnusedLocals": true, butpackages/types/tsconfig.jsonextends../../tsconfig.json(the root config), which sets"noUnusedLocals": false. Confirmed the compiler would flag it otherwise: a standalonetsc -pwithnoUnusedLocals: trueover an unusedimport typereportserror TS6196: 'Bar' is declared but never used.eslint.config.jssets'@typescript-eslint/no-unused-vars': ['warn', ...], and per that config's own comment.github/workflows/lint.ymlsets no--max-warnings, so it cannot fail CI.Impact
Zero runtime and zero
.d.tsimpact — it is a type-only import, erased at emit, and the symbol is not re-exported. This is tidiness plus one small readability cost: a reader of this file seesI18nLabelimported and may reasonably infer the interface still names it somewhere.Fix shape
Delete
I18nLabel,from the import block at :27 and re-runpnpm --filter @object-ui/types type-checkandlint. Worth checking at the same time whethertsconfig.base.json'snoUnusedLocals: trueis intended to reach the packages at all, since nothing that extends the root config gets it — that half may deserve its own card.Refs #4611.