Uh oh!
There was an error while loading. Please reload this page.
Repair five retired lucide spellings that reach the icons-record resolver - #5638
Merged
Merged
Conversation
…-record resolver (#5622) lucide retires a spelling by dropping it from its runtime `icons` record while keeping it as a deprecated named export, so a retired name still imports, still type-checks and still renders as a COMPONENT — and resolves to null wherever it is used as a STRING. Nothing goes red either way. - plugin-detail: DetailView's mobile Edit action 'edit' -> 'square-pen' - components: the ui:icon renderer's own default 'smile' -> 'face-slightly-smiling', in BOTH the registration icon and the name input's defaultValue - plugin-list: ViewSwitcher's VIEW_ICONS Grid -> Grid3x3, BarChart3 -> ChartColumn, GanttChartSquare -> ChartGantt - app-shell: the DeclaredActionsBar fixtures 'check-circle' -> 'circle-check-big' and 'x-circle' -> 'circle-x' Four resolvability pins assert icons-record MEMBERSHIP rather than resolvability: every retired spelling here is the SAME object as its replacement, so a render- or export-based assertion passes on the broken name.
Contributor
✅ Console Performance Budget
The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it. 📦 Bundle Size Report
Size Limits
|
os-sales
marked this pull request as ready for review
August 21, 2026 21:37
Uh oh!
There was an error while loading. Please reload this page.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for freeto join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes#5622
lucide retires a spelling by dropping it from its runtime
iconsrecord while keeping it as a deprecated named export. A retired name therefore still imports, still type-checks, and still renders wherever it is used as a component — and resolves tonullwherever it is used as a string, because every string lookup here reads that record. Nothing goes red in either direction. This repairs the five names on that path, plus the two retired fixture spellings, and pins each against record membership.Scope is half 1 only, exactly as triage split it. The repo-level
icon:-literal gate is not implemented here — it is tracked separately in #5633, which remains open.Membership probe re-run at claim time
Triage required this be re-measured rather than inherited, since the card exists because a name's membership moved underneath a working site.
lucide-react@1.31.0, resolved frompackages/components(single copy in the store:node_modules/.pnpm/lucide-react@1.31.0_react@19.2.8).iconsrecord carries 1767 entries.toPascalCase→iconNameMap({ Home: 'House' }) →key in icons.DetailViewmobile EditeditEditsquare-penSquarePenui:icondeclared defaultsmileSmileface-slightly-smilingFaceSlightlySmilingDeclaredActionsBarfixturecheck-circleCheckCirclecircle-check-bigCircleCheckBigDeclaredActionsBarfixturex-circleXCirclecircle-xCircleXplugin-listVIEW_ICONSGrid/GanttChartSquare/BarChart3Grid3x3/ChartGantt/ChartColumnThe measurement reproduces the issue body's table unchanged at this version.
Cited line numbers, re-derived on current
origin/mainAll three verified by code, exact:
packages/plugin-detail/src/DetailView.tsx— 784icon: 'edit'(itemsys_edit_mobileat 782) ✅packages/components/src/renderers/basic/icon.tsx— 83icon: 'smile', and 86defaultValue: 'smile'✅packages/plugin-list/src/ViewSwitcher.tsx—Gridat 13,GanttChartSquareat 18,BarChart3at 20, inside the cited 13–21 ✅The
smilereplacement — my product pickface-slightly-smiling, and the reason is that it is not a redesign.Smile === FaceSlightlySmilingistrueon the installed lucide — the record's own spelling points at the very same glyph object — so the designer palette entry and a freshly droppediconcomponent look exactly as they always did. The defect was that the palette glyph was blank and a droppediconrendered nothing plus aconsole.warn; the fix restores the intended appearance instead of choosing a new default look. Picking an unrelated live name (sticker,star,shapesall resolve) would have silently changed what the defaulticoncomponent is while fixing a spelling bug — a larger, unasked change.Both spots move together — the registration
icon:and thenameinput'sdefaultValue. Repairing one alone leaves either the default rendering nothing or the palette glyph blank, so a pin asserts the two stay equal.ganttis the one real glyph changeGanttChartSquareis genuinely a different object fromChartGantt(the identity-preserving live spelling isSquareChartGantt, andGanttChartSquare === SquareChartGanttistrue).ChartGanttis chosen anyway so both switchers draw the same glyph for the sameViewType:packages/plugin-view/src/ViewSwitcher.tsxlandedgrid: Grid3x3,gantt: ChartGantt,chart: ChartColumnin #5586. One view type drawing two different icons depending on which switcher is on screen is the drift worth avoiding.The pins go red on the unrepaired spellings
Four pins assert
icons-record membership, not resolvability — which is the whole point. Every retired spelling repaired here is the same component object as its replacement (Edit === SquarePen,Smile === FaceSlightlySmiling,Grid === Grid3x3,BarChart3 === ChartColumn,CheckCircle === CircleCheckBig,XCircle === CircleXare alltrue), so a pin that rendered the glyph or reached for the export would pass on the broken name. That is precisely the blindness that let this ship.Verified by ablation — production spellings reverted to the retired ones, mutation confirmed on disk by anchored
grep -ccounts on both the injected and the removed text, restored by anEXIT/INT/TERMtrap:The four membership assertions that went red:
components→ "names only liveiconskeys, on BOTH surfaces"plugin-detail→ "names only liveiconskeys"plugin-list→ "names only liveiconskeys"app-shell→ "names only liveiconskeys" (plus one incidental testid assertion in the same suite)Repeated twice with identical results;
RESTORE CONFIRMED: tree cleanon both runs. No rebuild leg applies here: every pin reads its subject through a relative source import (../renderers/basic/icon) or an explicitsrc/readFileSync, never throughdist/.DOM-leak ledger — no row edit owed
packages/components/src/renderers/**is now under the ledger (#5574). This change touches only theui:iconregistration metadata (icon:and the input'sdefaultValue), not the renderer's emitted markup, so the attribute set is unmoved:ui:iconstays ledgered asBARE_SPREAD_ON_SVGwith camelCase preserved — same case as the sibling round-9 PR that changed only text content.Verification
All gates run against the final commit
46b096008, working tree clean.pnpm vitest runfrom the repo root (package-cwd is refused by the repo's guard, objectui#3378):Test Files 4 passed (4),Tests 30 passed (30).Tests 200 passed (200).@object-ui/components,plugin-detail,plugin-list,app-shellall pass; all four script names echoed in the output, so this is not a zero-match silent pass.check-changeset-presence.mjs, exit 0, verdict line:✅ 7 source file(s) of 4 released package(s) changed, and this change declares 1 changeset(s): .changeset/retired-lucide-spellings-5622.md..ts/.tsxfiles,eslint --no-inline-config: 0 errors, 62 warnings, every one pre-existingno-explicit-anyon lines this diff does not touch. Narrowed deliberately, and the narrowing is a measurement rather than a gap: file count 7 read from--format json, and type-aware linting is not enabled (noprojectService/parserOptions.projectineslint.config.js), so a per-file verdict cannot move for any file this diff does not touch. CI runs the full farm regardless.Generated by Claude Code
Generated by Claude Code