Development#149
Conversation
Dokploy Preview Deployment
|
📝 WalkthroughWalkthroughThe release updates version support documentation, changelog and package metadata, fixes HTML entity decoding order, and adds collapsible chip-based filtering with price-first defaults to VPS and Dedicated hubs. Game hub sorting now defaults to ascending price. ChangesRelease and plan discovery
Estimated code review effort: 3 (Moderate) | ~20 minutes Possibly related PRs
🚥 Pre-merge checks | ✅ 3 | ❌ 2❌ Failed checks (1 warning, 1 inconclusive)
✅ Passed checks (3 passed)
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
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. Comment |
There was a problem hiding this comment.
Actionable comments posted: 4
🧹 Nitpick comments (1)
packages/core/lib/spec-parser.ts (1)
54-64: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winUnescape-ordering fix is correct — consider a regression test.
Traced through the
>example: the new order (leaf entities first,&last) correctly yields>where the old order collapsed it to>. Since this was a CodeQL-flagged bug and feedsparseDescriptionSpecs(whose missing fields cause plans to be silently dropped downstream ingetVpsPlans/getDedicatedPlans), a small unit test assertingbulletLines/parseDescriptionSpecshandles>,<,"correctly would guard against a regression.🤖 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/core/lib/spec-parser.ts` around lines 54 - 64, Add a regression test for the spec parsing flow, targeting the function that produces bullet lines or parseDescriptionSpecs, with encoded inputs &gt;, &lt;, and &quot;. Assert these remain >, <, and " after parsing, while preserving the existing unescape ordering in the implementation.
🤖 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 @.github/SECURITY.md:
- Around line 110-114: Update the version-support table in SECURITY.md to
explicitly classify 3.5.x, including the current baseline version 3.5.4, and
ensure the version ranges do not leave any release uncovered. Normalize the
“Support Until” wording across all rows, preserving the intended support dates
and unsupported status.
In `@packages/ui/components/Layouts/Dedicated/dedicated-hub.tsx`:
- Around line 349-414: Update the Filters toggle and filter panel in
packages/ui/components/Layouts/Dedicated/dedicated-hub.tsx#L349-L414 and
packages/ui/components/Layouts/VPS/vps-hub.tsx#L377-L397: associate each Button
with its Collapsible using CollapsibleTrigger asChild or matching aria-expanded
and aria-controls attributes, and assign a corresponding id to each panel. Keep
the existing filtersOpen toggle behavior intact.
In `@packages/ui/components/ui/filter-chip.tsx`:
- Around line 1-2: Update the FilterChip toggle button to include
aria-pressed={active}, exposing its current active state to assistive
technologies while preserving the existing styling and behavior.
- Around line 15-38: Update the toggleable button in FilterChip to include
aria-pressed={active}, exposing the existing active state to assistive
technologies while preserving the current click behavior and styling.
---
Nitpick comments:
In `@packages/core/lib/spec-parser.ts`:
- Around line 54-64: Add a regression test for the spec parsing flow, targeting
the function that produces bullet lines or parseDescriptionSpecs, with encoded
inputs &gt;, &lt;, and &quot;. Assert these remain >, <, and
" after parsing, while preserving the existing unescape ordering in the
implementation.
🪄 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: dbef729f-3125-4cad-999f-dda7aea7e87d
📒 Files selected for processing (8)
.github/SECURITY.mdCHANGELOG.mdpackage.jsonpackages/core/lib/spec-parser.tspackages/ui/components/Layouts/Dedicated/dedicated-hub.tsxpackages/ui/components/Layouts/Games/game-hub.tsxpackages/ui/components/Layouts/VPS/vps-hub.tsxpackages/ui/components/ui/filter-chip.tsx
| | Version | Status | Support Until | | ||
| |---------|---------------|---------------| | ||
| | 3.7.x | Current | 3.8.x Release | | ||
| | 3.6.x | Security Only | ~ Aug 2026 | | ||
| | < 3.5 | Unsupported | End of life | |
There was a problem hiding this comment.
📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win
Version table leaves 3.5.x support status undefined.
< 3.5 excludes 3.5.x itself, and 3.6.x doesn't cover it either — so the version this PR is bumping from (3.5.4, per package.json) has no documented support status. Also worth tightening the inconsistent "Support Until" phrasing (3.8.x Release vs ~ Aug 2026 vs End of life).
📝 Proposed fix
| Version | Status | Support Until |
|---------|---------------|---------------|
| 3.7.x | Current | 3.8.x Release |
| 3.6.x | Security Only | Aug 2026 |
-| < 3.5 | Unsupported | End of life |
+| 3.5.x | Unsupported | End of life |
+| < 3.5 | Unsupported | End of life |📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| | Version | Status | Support Until | | |
| |---------|---------------|---------------| | |
| | 3.7.x | Current | 3.8.x Release | | |
| | 3.6.x | Security Only | ~ Aug 2026 | | |
| | < 3.5 | Unsupported | End of life | | |
| | Version | Status | Support Until | | |
| |---------|---------------|---------------| | |
| | 3.7.x | Current | 3.8.x Release | | |
| | 3.6.x | Security Only | Aug 2026 | | |
| | 3.5.x | Unsupported | End of life | | |
| | < 3.5 | Unsupported | End of life | |
🤖 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 @.github/SECURITY.md around lines 110 - 114, Update the version-support table
in SECURITY.md to explicitly classify 3.5.x, including the current baseline
version 3.5.4, and ensure the version ranges do not leave any release uncovered.
Normalize the “Support Until” wording across all rows, preserving the intended
support dates and unsupported status.
| <Button | ||
| variant="outline" | ||
| size="sm" | ||
| onClick={() => setFiltersOpen((v) => !v)} | ||
| className="gap-1.5 bg-card/30 border-border/50" | ||
| > | ||
| <SlidersHorizontal className="w-3.5 h-3.5" /> | ||
| Filters | ||
| {activeFilterCount > 0 && ( | ||
| <Badge variant="secondary" className="ml-0.5 h-4 min-w-4 px-1 text-[10px]"> | ||
| {activeFilterCount} | ||
| </Badge> | ||
| )} | ||
| <ChevronDown className={cn("w-3.5 h-3.5 transition-transform", filtersOpen && "rotate-180")} /> | ||
| </Button> | ||
| {hasActiveFilters && ( | ||
| <Button variant="ghost" size="sm" onClick={clearFilters} className="gap-1.5 text-muted-foreground"> | ||
| <X className="w-3.5 h-3.5" /> Clear | ||
| </Button> | ||
| )} | ||
| </div> | ||
|
|
||
| {/* RAM tier row */} | ||
| <div className="flex flex-wrap gap-1.5 items-center"> | ||
| <button | ||
| type="button" | ||
| onClick={() => setRam("ALL")} | ||
| className={cn( | ||
| "px-3 py-1 rounded-full text-xs font-medium border transition-all", | ||
| ram === "ALL" | ||
| ? "border-primary/50 bg-primary/10 text-primary" | ||
| : "border-border/50 text-muted-foreground hover:border-border hover:text-foreground", | ||
| )} | ||
| > | ||
| All RAM | ||
| </button> | ||
| {availableRam.map((r) => ( | ||
| <button | ||
| key={r} | ||
| type="button" | ||
| onClick={() => setRam(ram === r ? "ALL" : r)} | ||
| className={cn( | ||
| "px-3 py-1 rounded-full text-xs font-medium border transition-all", | ||
| ram === r | ||
| ? "border-primary/50 bg-primary/10 text-primary" | ||
| : "border-border/50 text-muted-foreground hover:border-border hover:text-foreground", | ||
| )} | ||
| > | ||
| {r} GB | ||
| </button> | ||
| ))} | ||
| </div> | ||
| <Collapsible open={filtersOpen} onOpenChange={setFiltersOpen}> | ||
| <CollapsibleContent> | ||
| <div className="rounded-xl border border-border/50 bg-card/20 p-4 space-y-3"> | ||
| <FilterChipRow label="Price"> | ||
| <div className="flex items-center gap-1.5"> | ||
| <Input | ||
| type="number" | ||
| inputMode="decimal" | ||
| placeholder="Min £" | ||
| value={priceMin} | ||
| onChange={(e) => setPriceMin(e.target.value)} | ||
| className="w-24 h-7 bg-card/30 border-border/50 text-xs" | ||
| /> | ||
| <span className="text-muted-foreground text-sm">–</span> | ||
| <Input | ||
| type="number" | ||
| inputMode="decimal" | ||
| placeholder="Max £" | ||
| value={priceMax} | ||
| onChange={(e) => setPriceMax(e.target.value)} | ||
| className="w-24 h-7 bg-card/30 border-border/50 text-xs" | ||
| /> | ||
| </div> | ||
| </FilterChipRow> | ||
|
|
||
| <FilterChipRow label="RAM"> | ||
| <FilterChip active={ram === "ALL"} onClick={() => setRam("ALL")}>All RAM</FilterChip> | ||
| {availableRam.map((r) => ( | ||
| <FilterChip key={r} active={ram === r} onClick={() => setRam(ram === r ? "ALL" : r)}> | ||
| {r} GB | ||
| </FilterChip> | ||
| ))} | ||
| </FilterChipRow> | ||
|
|
||
| <FilterChipRow label="Hardware"> | ||
| {(["ALL", "amd", "intel"] as const).map((h) => ( | ||
| <FilterChip key={h} active={hardware === h} onClick={() => setHardware(h)}> | ||
| {h === "ALL" ? "All Hardware" : h.toUpperCase()} | ||
| </FilterChip> | ||
| ))} | ||
| </FilterChipRow> | ||
| </div> | ||
| </CollapsibleContent> | ||
| </Collapsible> |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
set -euo pipefail
printf '\n== dedicated-hub.tsx relevant lines ==\n'
sed -n '320,440p' packages/ui/components/Layouts/Dedicated/dedicated-hub.tsx
printf '\n== vps-hub.tsx relevant lines ==\n'
sed -n '340,430p' packages/ui/components/Layouts/VPS/vps-hub.tsx
printf '\n== search for CollapsibleTrigger / aria-expanded / aria-controls in related UI ==\n'
rg -n "CollapsibleTrigger|aria-expanded|aria-controls|CollapsibleContent" packages/ui/components/Layouts packages/ui/components -g '*.tsx' | sed -n '1,200p'Repository: NodeByteHosting/website
Length of output: 15968
Add disclosure ARIA to the Filters toggle in both hubs.
The current plain Button only toggles filtersOpen; it doesn’t expose aria-expanded/aria-controls for the filter panel. Use CollapsibleTrigger asChild or add those attributes plus a matching panel id in:
packages/ui/components/Layouts/Dedicated/dedicated-hub.tsx#L349-L414packages/ui/components/Layouts/VPS/vps-hub.tsx#L377-L397
📍 Affects 2 files
packages/ui/components/Layouts/Dedicated/dedicated-hub.tsx#L349-L414(this comment)packages/ui/components/Layouts/VPS/vps-hub.tsx#L377-L397
🤖 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/components/Layouts/Dedicated/dedicated-hub.tsx` around lines 349
- 414, Update the Filters toggle and filter panel in
packages/ui/components/Layouts/Dedicated/dedicated-hub.tsx#L349-L414 and
packages/ui/components/Layouts/VPS/vps-hub.tsx#L377-L397: associate each Button
with its Collapsible using CollapsibleTrigger asChild or matching aria-expanded
and aria-controls attributes, and assign a corresponding id to each panel. Keep
the existing filtersOpen toggle behavior intact.
| import type { ReactNode } from "react" | ||
| import { cn } from "@/lib/utils" |
There was a problem hiding this comment.
🩺 Stability & Availability | 🟡 Minor | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
# Check tsconfig path aliases and how sibling ui/ files import `cn`
fd tsconfig.json --max-depth 2 -x cat {}
echo "---"
rg -n "from ['\"]`@/lib/utils`['\"]|from ['\"]`@/packages/core/lib/utils`['\"]" packages/ui/components/uiRepository: NodeByteHosting/website
Length of output: 5130
🏁 Script executed:
#!/bin/bash
set -euo pipefail
file="packages/ui/components/ui/filter-chip.tsx"
wc -l "$file"
echo "---"
cat -n "$file"Repository: NodeByteHosting/website
Length of output: 1612
Add aria-pressed to the filter toggle
FilterChip is a toggle button, so set aria-pressed={active} to expose its on/off state to assistive tech.
🤖 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/components/ui/filter-chip.tsx` around lines 1 - 2, Update the
FilterChip toggle button to include aria-pressed={active}, exposing its current
active state to assistive technologies while preserving the existing styling and
behavior.
| export function FilterChip({ | ||
| active, | ||
| onClick, | ||
| children, | ||
| }: { | ||
| active: boolean | ||
| onClick: () => void | ||
| children: ReactNode | ||
| }) { | ||
| return ( | ||
| <button | ||
| type="button" | ||
| onClick={onClick} | ||
| className={cn( | ||
| "px-3 py-1 rounded-full text-xs font-medium border transition-all", | ||
| active | ||
| ? "border-primary/50 bg-primary/10 text-primary" | ||
| : "border-border/50 text-muted-foreground hover:border-border hover:text-foreground", | ||
| )} | ||
| > | ||
| {children} | ||
| </button> | ||
| ) | ||
| } |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
set -euo pipefail
echo '--- filter-chip.tsx ---'
sed -n '1,220p' packages/ui/components/ui/filter-chip.tsx
echo
echo '--- usages of FilterChip ---'
rg -n "FilterChip" packages -g '!**/dist/**' -g '!**/build/**'
echo
echo '--- nearby aria patterns in ui components ---'
rg -n "aria-pressed|role=\"switch\"|aria-selected|role=\"tab\"" packages/ui -g '!**/dist/**' -g '!**/build/**'Repository: NodeByteHosting/website
Length of output: 5491
🏁 Script executed:
set -euo pipefail
pwd
git ls-files packages/ui/components/ui/filter-chip.tsx
sed -n '1,120p' packages/ui/components/ui/filter-chip.tsx
rg -n "FilterChip" packages -g '!**/dist/**' -g '!**/build/**'Repository: NodeByteHosting/website
Length of output: 5337
Add aria-pressed to expose the active state.
FilterChip is a toggleable button, but active is only reflected visually. Add aria-pressed={active} so screen readers can announce which filters are selected.
🤖 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/components/ui/filter-chip.tsx` around lines 15 - 38, Update the
toggleable button in FilterChip to include aria-pressed={active}, exposing the
existing active state to assistive technologies while preserving the current
click behavior and styling.
Summary by CodeRabbit
New Features
Bug Fixes
Documentation