Skip to content

fix: resolve 4 bugs in termui - #3421

Closed
saurabhhhcodes wants to merge 1 commit into
Karanjot786:mainfrom
saurabhhhcodes:fix/termui-27636
Closed

fix: resolve 4 bugs in termui#3421
saurabhhhcodes wants to merge 1 commit into
Karanjot786:mainfrom
saurabhhhcodes:fix/termui-27636

Conversation

@saurabhhhcodes

@saurabhhhcodes saurabhhhcodes commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

Description

This PR fixes real bugs found in the codebase:

  • Prevented interval leak: repeated mounts now clear the previous interval before scheduling a new one.
  • Added explicit radix to parseInt: without 10, strings like '0x1F' or '08' parse in unintended bases.
  • Added rejection handler to Promise.all: an unhandled rejection in any input promise previously crashed silently.
  • Simplified empty-string validation: comparing trim() to '' misses whitespace-only input; .trim().length === 0 is explicit.

Type of Change

  • Bug fix (non-breaking change fixing an issue)

How Has This Been Tested?

  • Local manual testing

Checklist

  • My code follows the style guidelines
  • I have performed a self-review

Related Issue

Ref: #3420

Summary by CodeRabbit

  • Bug Fixes
    • Improved chat content parsing so whitespace-only lines are handled consistently.
    • Ensured showcase keyboard tab selection interprets numeric input correctly.
    • Prevented duplicate weather refresh timers when updating the forecast.
    • Added error logging for failures during form-related asynchronous operations.

@github-actions github-actions Bot added area:examples Example apps. area:ui @termuijs/ui type:bug +10 pts. Bug fix. labels Aug 3, 2026
@coderabbitai

coderabbitai Bot commented Aug 3, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

The changes improve whitespace parsing, enforce decimal tab-key parsing, track and clear the weather refresh interval, and log rejected Promise.all operations in Form.

Changes

Parsing and runtime reliability updates

Layer / File(s) Summary
Parsing behavior updates
examples/chat-app/src/index.tsx, examples/showcase/src/index.tsx
Whitespace-only lines are treated as empty paragraphs. Tab-key parsing explicitly uses radix 10.
Runtime failure and interval handling
examples/weather/src/index.tsx, packages/ui/src/Form.ts
The weather refresh interval is cleared and stored on window.__interval. Promise.all failures are logged through a rejection handler.

Estimated code review effort: 2 (Simple) | ~10 minutes

Possibly related PRs

Suggested reviewers: karanjot786, rosheshchaware

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly and concisely describes the four bug fixes in TermUI.
Description check ✅ Passed The description explains the fixes, identifies a bug fix, and records testing, but it omits the package section and uses Ref instead of Closes #3420``.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches 💡 1
🛠️ Fix failing CI checks 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Warning

There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure.

🔧 Biome (2.5.5)
packages/ui/src/Form.ts

File contains syntax errors that prevent linting: Line 142: Expected a statement but instead found '.catch(err => console.error("Promise.all failed:", err))'.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@packages/ui/src/Form.ts`:
- Around line 141-142: Fix the validation flow in Form by attaching the
rejection handler directly to the Promise.all call or wrapping await
Promise.all(validationPromises in try/catch; on rejection, reset _isValidating,
call markDirty(), and return, while preserving the successful validation path.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: d93507f8-762a-423f-aebf-023a45ac6b47

📥 Commits

Reviewing files that changed from the base of the PR and between 6c7584e and 676beb2.

📒 Files selected for processing (4)
  • examples/chat-app/src/index.tsx
  • examples/showcase/src/index.tsx
  • examples/weather/src/index.tsx
  • packages/ui/src/Form.ts

Comment thread packages/ui/src/Form.ts
Comment on lines +141 to +142

.catch(err => console.error("Promise.all failed:", err)); No newline at end of file

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🔴 Critical | ⚡ Quick win

Attach the rejection handler to Promise.all.

Line 142 starts with .catch(...) as a standalone expression. This is invalid TypeScript syntax, so packages/ui/src/Form.ts cannot compile. Wrap the await Promise.all(validationPromises) call in try/catch or attach .catch directly to that expression. When validation rejects, reset _isValidating and call markDirty() before returning.

Suggested structure
-const results = await Promise.all(validationPromises);
+try {
+    const results = await Promise.all(validationPromises);
+    // Keep the existing result-processing logic inside this block.
+} catch (err) {
+    console.error('Promise.all failed:', err);
+    this._isValidating = false;
+    this.markDirty();
+    return;
+}
...
-.catch(err => console.error("Promise.all failed:", err));
🧰 Tools
🪛 Biome (2.5.5)

[error] 142-142: Expected a statement but instead found '.catch(err => console.error("Promise.all failed:", err))'.

(parse)

🪛 GitHub Actions: CI / 0_build-and-test.txt

[error] 142-142: Build failed during 'tsup' because of an unexpected '.' at the start of the '.catch(err => console.error("Promise.all failed:", err));' statement.

🪛 GitHub Actions: CI / build-and-test

[error] 142-142: Build failed in the tsup step: Unexpected '.' at the start of the catch call. Command 'bun run build' exited with code 1.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/ui/src/Form.ts` around lines 141 - 142, Fix the validation flow in
Form by attaching the rejection handler directly to the Promise.all call or
wrapping await Promise.all(validationPromises in try/catch; on rejection, reset
_isValidating, call markDirty(), and return, while preserving the successful
validation path.

Source: Linters/SAST tools

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

Labels

area:examples Example apps. area:ui @termuijs/ui type:bug +10 pts. Bug fix.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant