Repository navigation
refactor: use Number.parseInt/Number.isNaN and lint against the globals - #645
Merged
Merged
Conversation
The codebase mixed the two spellings: 39 parseInt vs 6 Number.parseInt, 14 isNaN vs 14 Number.isNaN (Number.isFinite and Number.parseFloat were already used exclusively). parseInt -> Number.parseInt is a pure rename (they are the same function). Number.isNaN differs from the global only for non-number arguments, which it doesn't coerce; every one of the 14 calls checks the result of parseInt(..., 10), a number, so behavior is unchanged. ESLint's built-in no-restricted-globals now rejects global parseInt, parseFloat, isNaN and isFinite with a message pointing at the Number.* form, so the mix doesn't come back. No new dependency.
This was referenced Oct 4, 2026
pcvelz
added a commit
to pcvelz/ccstatusline-usage
that referenced
this pull request
Oct 11, 2026
Upstream: label prefixes editable with e (sirmalloc#601, sirmalloc#666), Session Cost Rate (sirmalloc#671) and Extra Usage Daily Budget (sirmalloc#672) widgets, own-lock-only usage lock clearing (sirmalloc#624), NO_PROXY and request deadlines, terminal control-sequence sanitizing, git hardening and linear-time parsing, shared searchable option editor (sirmalloc#649) and widget base classes (sirmalloc#646-sirmalloc#654), node: imports (sirmalloc#657), Number.* globals lint (sirmalloc#645), test waits on redraw instead of fixed delays (sirmalloc#652). Hand edits outside conflicts: - src/widgets/shared/searchable-option-editor.tsx: compat fix - ports the fork's ref-based input handling (Enter picks from what was just typed) into upstream's new shared editor - src/utils/usage-fetch.ts: compat fix - fork's fetchFreshUsageData uses upstream's clearOwnUsageLock (sirmalloc#624) instead of the removed clearUsageLock - src/widgets/ApiUsage.tsx, src/widgets/Battery.ts: compat fix - Number.isNaN/Number.parseInt for upstream's no-restricted-globals rule - src/utils/__tests__/usage-prefetch.test.ts: compat fix - mock renamed to upstream's mockFetchUsage - src/tui/components/__tests__/PowerlineSetup.test.ts, src/tui/components/__tests__/StatusLinePreview.test.ts, src/tui/components/__tests__/TerminalWidthMenu.test.ts: compat fix - drop the fork's flushInk import, unused after upstream's waitFor switch - README.md: upstream notes linked docs/USAGE.md (deleted in the fork); inlined the proxy and workspace-trust text instead; upstream's own release-note entries not taken - .fork-keep-deleted: src/widgets/FableWeeklyUsage.ts (upstream widget, unregistered in the fork, which ships WeeklyFableUsage.ts) - src/widgets/WeeklyFableUsage.ts: compat fix - adopts upstream's shared getUsagePercentWidgetEditorDisplay, which carries the time-cursor modifier - src/tui/__tests__/App.test.ts: fork deviation - one extra down-arrow for the fork's Off Hours main-menu row - src/widgets/__tests__/CacheTimer.test.ts, src/widgets/CacheTimer.ts: compat fix - emoji toggle moved from e to o because upstream reserves e for edit-label - src/widgets/AgentAddress.ts: split the session-title guard into its own if (same behaviour) so the .fork-invariants nameSource guard matches again - docs/test-retirements.md: ledger for tests upstream renamed or replaced
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 free
to 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.
Summary
The codebase mixes two spellings of the same number helpers: 53 calls use the global
parseInt/isNaN, the rest theNumber.forms. This makes them consistent and adds a lint rule so the mix doesn't come back.Number.form / global formparseIntNumber.parseIntisNaNNumber.isNaNisFiniteparseFloatNewer code (token speed widgets, usage API) already uses the
Number.forms; the older code (colors.ts,git.ts, the menus) used the globals.Skills.tsxmixed both styles in the same file.No behavior change
parseInt→Number.parseIntis a pure rename:Number.parseInt === parseInt.isNaN→Number.isNaNonly differs for non-number arguments: the global converts its argument first (isNaN('abc')istrue,Number.isNaN('abc')isfalse). I checked all 14 calls: each tests the result ofparseInt(..., 10)on the line before, which is always a number. TypeScript also only allowsnumberfor the globalisNaN.Number.prefix stripped, the removed and added lines in the diff match exactly. Nothing else changed.Lint rule
ESLint's built-in
no-restricted-globalsrejects globalparseInt,parseFloat,isNaNandisFinite, with a message pointing to theNumber.form:It needs no new dependency.
parseFloatandisFiniteare included preemptively; the code already uses only theirNumber.forms.Testing
bun run lintflagged exactly the 53 global calls (39parseInt, 14isNaN).bun run lintis clean andbun testpasses 2,358 tests.parseInt(...),isNaN(...)andNumber.parseInt(...)gets errors on the first two only.