Skip to content

chore: strip Stripe/payments from starter template#53

Merged
wardbox merged 16 commits intomainfrom
chore/strip-payments
Feb 16, 2026
Merged

chore: strip Stripe/payments from starter template#53
wardbox merged 16 commits intomainfrom
chore/strip-payments

Conversation

@wardbox
Copy link
Copy Markdown
Owner

@wardbox wardbox commented Feb 13, 2026

Summary

Remove all payment/Stripe code from Roke to make it a clean, minimal starter template. Payments will be available as a separate add-on module.

Removed

  • src/payment/ — entire directory
  • main.wasp — subscription/checkout routes, Stripe actions & webhook API
  • schema.prisma — Stripe fields from User model
  • src/ProfilePage.tsx — subscription UI
  • .env.server.example — STRIPE_* env vars
  • README.md & CLAUDE.md — payment references

Added

  • TODO comments on example.com placeholder URLs in main.wasp

Preserved

Auth, shadcn/ui, Motion animations, dark mode, TypeScript, profile page, landing page

Summary by CodeRabbit

Release Notes

  • Breaking Changes

    • Removed Stripe payment integration and subscription management features from the application.
  • Updates

    • Upgraded core dependencies: React 19, React Router 7, Tailwind CSS 4, and UI component libraries.
    • Updated icon library and improved visual components.
    • Enhanced type safety with React 19 compatibility improvements.
  • Removals

    • Eliminated subscription checkout and customer portal pages.
    • Simplified user profile by removing subscription status information.

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Feb 13, 2026

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

Walkthrough

This PR removes Stripe payment integration, upgrades React to v19 and React Router to v7, updates UI dependencies (Phosphor Icons, Tailwind v4), refactors TypeScript compatibility issues, and applies extensive CSS class reordering across the codebase.

Changes

Cohort / File(s) Summary
Payment/Stripe Removal
main.wasp, schema.prisma, src/ProfilePage.tsx, src/payment/*, .env.server.example, README.md, CLAUDE.md
Removed entire Stripe payment module including routes (SubscriptionRoute, CheckoutResultRoute), pages, actions, API webhooks, User schema fields (stripeCustomerId, subscriptionStatus, trialEndsAt), and all supporting documentation and environment variables.
Core Dependencies & Version Upgrades
package.json
Updated React to v19, React Router v7, Tailwind CSS v4, Lucide React to major version, replaced lucide-react with Phosphor Icons in select components, removed stripe package, added @tailwindcss/vite plugin, updated workspace paths.
React Router Migration
src/lib/utils.ts, src/auth/auth.tsx, src/RootPage.tsx, src/root-components/nav.tsx, src/root-components/footer.tsx
Migrated import source for useLocation and Link from react-router-dom to react-router across multiple files.
Icon Library Updates
src/client/components/mode-toggle.tsx, src/root-components/toast.tsx
Replaced lucide-react icons (Sun, Moon, X) with Phosphor equivalents (SunIcon, MoonIcon, XIcon) with corresponding className adjustments.
React 19 TypeScript Compatibility
src/client/components/ui/button.tsx, src/hooks/use-toast.ts, src/root-components/theme-provider.tsx, src/root-components/toaster.tsx, src/global.d.ts
Added // @ts-nocheck`` directives and explicit type casting (as any) for forwardRef components to resolve React 19 type compatibility issues; added global augmentation scaffold in new global.d.ts.
Component forwardRef Refactoring
src/client/components/ui/dropdown-menu.tsx, src/client/components/ui/sheet.tsx, src/client/components/ui/slider.tsx
Converted forwardRef signatures from generic to function-style with explicit prop destructuring, ref typing, and any-casts for React 19 compatibility; updated internal className composition across 10+ subcomponents.
Tailwind & Build Config
vite.config.ts, src/Root.css, tailwind.config.js, postcss.config.js
Updated Tailwind integration from preflight directives to explicit import and config reference, added Wasp and Tailwind plugins to Vite, removed postcss.config.js export, removed dynamic content path from Tailwind config.
CSS Class Reordering
src/404Page.tsx, src/landing/LandingPage.tsx, src/root-components/scroll-to-top.tsx, src/client/components/ui/card.tsx, src/client/components/ui/skeleton.tsx, src/root-components/nav.tsx
Reordered Tailwind utility class sequences across multiple elements without altering visual behavior or semantics; purely cosmetic class order changes.
Version Bumps & Config
main.wasp
Updated Wasp framework version from ^0.19.1 to ^0.21.0; updated metadata (og:url, og:image, twitter:domain/url/image) with roke.dev domain and TODOs; changed auth email sender from "wizard@example.com" (example.com) to "noreply@example.com" (Roke).

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

  • Wardbox/revamp #52: Related through Stripe payment integration removal—this PR deletes payment infrastructure and configuration that the referenced PR had previously added or modified.

Poem

🐰 Stripe has left the warren, React's grown bold and new,
With Phosphor icons gleaming and Router v7 too,
Classes shuffled, types now cast, a thousand small tweaks done,
The payment stable's empty now—our journey's just begun!

🚥 Pre-merge checks | ✅ 3 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately describes the main objective of the changeset: removing Stripe/payment functionality from the starter template.
Merge Conflict Detection ✅ Passed ✅ No merge conflicts detected when merging into main

✏️ Tip: You can configure your own custom pre-merge checks in the settings.


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

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
main.wasp (1)

63-129: ⚠️ Potential issue | 🔴 Critical

Remove payment references from main.wasp — module no longer exists in repository.

The src/payment directory has been removed, but main.wasp still contains seven references to it (routes, pages, query, actions, and API endpoint for Stripe webhooks). These broken imports will cause build failures. Remove all payment-related definitions from lines 63-129.

Proposed fix
-route SubscriptionRoute { path: "/subscription", to: SubscriptionPage }
-route CheckoutResultRoute { path: "/checkout", to: CheckoutResultPage }
-
 page NotFoundRoute { path: "*", to: NotFoundPage }
@@
-page SubscriptionPage {
-  component: import SubscriptionPage from "@src/payment/SubscriptionPage",
-  authRequired: true,
-}
-
-page CheckoutResultPage {
-  component: import CheckoutResultPage from "@src/payment/CheckoutResultPage",
-  authRequired: true,
-}
-
 page NotFoundPage {
   component: import NotFound from "@src/404Page"
 }
-
-query getPaymentConfig {
-  fn: import { getPaymentConfig } from "@src/payment/stripe/operations",
-}
-
-action createCheckoutSession {
-  fn: import { createCheckoutSession } from "@src/payment/stripe/operations",
-  entities: [User]
-}
-
-action createCustomerPortalSession {
-  fn: import { createCustomerPortalSession } from "@src/payment/stripe/operations",
-  entities: [User]
-}
-
-api stripeWebhook {
-  fn: import { handleStripeWebhook } from "@src/payment/stripe/webhooks",
-  middlewareConfigFn: import { stripeWebhookMiddlewareConfigFn } from "@src/payment/stripe/webhooks",
-  httpRoute: (POST, "/stripe-webhooks"),
-  entities: [User]
-}
🤖 Fix all issues with AI agents
In `@README.md`:
- Around line 42-46: Update the README checklist entry for Meta tags to
reference the actual placeholder domain used in main.wasp: change the phrase
"replace example.com TODOs" to something like "replace roke.dev TODOs" or a
neutral "replace placeholder domain TODOs"; specifically edit the line "Meta
tags - Update `head` section in `main.wasp` (replace example.com TODOs)" so it
accurately reflects `main.wasp`'s use of roke.dev placeholders and avoid
confusion for contributors.

Comment thread README.md
wardbox added a commit that referenced this pull request Feb 13, 2026
…E placeholder wording

- Remove SubscriptionRoute, CheckoutResultRoute routes
- Remove SubscriptionPage, CheckoutResultPage page definitions
- Remove getPaymentConfig query, createCheckoutSession/createCustomerPortalSession actions
- Remove stripeWebhook API endpoint
- Update README checklist to reference roke.dev instead of example.com

Addresses CodeRabbit review comments on PR #53
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 2

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
package.json (1)

12-56: ⚠️ Potential issue | 🟡 Minor

Pin exact versions for React runtime and type packages.

Lines 54-56 and line 73 use caret ranges for react, react-dom, and @types/react. These are critical dependencies and should be pinned to exact versions to prevent unintended upgrades.

🔧 Proposed fix
-    "react": "^19.2.1",
-    "react-dom": "^19.2.1",
+    "react": "19.2.1",
+    "react-dom": "19.2.1",
-    "@types/react": "^19.2.7",
+    "@types/react": "19.2.7",
🤖 Fix all issues with AI agents
In `@src/client/components/mode-toggle.tsx`:
- Line 1: Remove the file-wide "@ts-nocheck" at the top of mode-toggle.tsx and
instead resolve the specific React 19 type issues or apply scoped suppressions
(use "@ts-expect-error" only on the few problematic lines) so the rest of the
file retains full TypeScript checking; also delete the non-essential comment and
update the icon import statements to use "@phosphor-icons/react" in place of
"lucide-react" (locate the ModeToggle component and its icon imports to make
these changes).

In `@src/root-components/transition-playground.tsx`:
- Line 1: Remove the file-level "// `@ts-nocheck`" and delete the top-level import
"import * as React from 'react'" from transition-playground.tsx; rely on the
automatic JSX runtime instead and, if you need specific types, import them as
type-only (e.g., "import type { FC, ReactNode } from 'react'") so TypeScript
checks remain enabled; also remove the extraneous reviewer-style comment at the
top so the file contains only meaningful comments and proper imports.
🧹 Nitpick comments (3)
src/client/components/ui/slider.tsx (1)

1-1: Consider tracking the removal of @ts-nocheck once Radix types are updated.

The blanket @ts-nocheck disables all TypeScript checking in this file. While this is a pragmatic workaround for React 19 compatibility issues with Radix UI, it also suppresses legitimate type errors. Consider adding a tracking issue to revisit this once @radix-ui/react-slider releases React 19-compatible types.

src/client/components/ui/dropdown-menu.tsx (1)

4-4: Icon imports should use @phosphor-icons/react.

The icons Check, ChevronRight, and Circle are imported from lucide-react, but the coding guidelines specify that icons in src/client/components/**/*.{ts,tsx} should be imported from @phosphor-icons/react.

♻️ Suggested fix
-import { Check, ChevronRight, Circle } from 'lucide-react'
+import { Check, CaretRight, Circle } from '@phosphor-icons/react'

Then update usages:

  • Line 42: <ChevronRight className='ml-auto' /><CaretRight className='ml-auto' weight='bold' />
  • Line 139: <Check className='h-4 w-4' /><Check size={16} />
  • Line 168: <Circle className='h-2 w-2 fill-current' /><Circle size={8} weight='fill' />

As per coding guidelines: "Icons should be imported from @phosphor-icons/react package" and "Phosphor icons should be used with size and weight props".

src/client/components/ui/sheet.tsx (1)

5-5: Icon import should use @phosphor-icons/react.

The X icon is imported from lucide-react, but the coding guidelines specify that icons in src/client/components/**/*.{ts,tsx} should be imported from @phosphor-icons/react.

♻️ Suggested fix
-import { X } from 'lucide-react'
+import { X } from '@phosphor-icons/react'

Then update the usage at line 75:

-          <X className='h-4 w-4' />
+          <X size={16} />

As per coding guidelines: "Icons should be imported from @phosphor-icons/react package" and "Phosphor icons should be used with size and weight props".

Comment thread src/client/components/mode-toggle.tsx Outdated
Comment thread src/root-components/transition-playground.tsx Outdated
Remove all payment-related code to make Roke a clean, minimal starter.
Payments will be available as a separate add-on module.

Removed:
- src/payment/ directory (Stripe checkout, subscriptions, webhooks)
- Subscription/checkout routes and pages from main.wasp
- Stripe fields from User model (stripeCustomerId, subscriptionStatus, trialEndsAt)
- Stripe env vars from .env.server.example
- Subscription UI from ProfilePage
- Payment references from README.md and CLAUDE.md
- Added TODO comments to example.com placeholder URLs in main.wasp head
…E placeholder wording

- Remove SubscriptionRoute, CheckoutResultRoute routes
- Remove SubscriptionPage, CheckoutResultPage page definitions
- Remove getPaymentConfig query, createCheckoutSession/createCustomerPortalSession actions
- Remove stripeWebhook API endpoint
- Update README checklist to reference roke.dev instead of example.com

Addresses CodeRabbit review comments on PR #53
- Bump wasp version to ^0.20.0
- Upgrade react/react-dom to ^19.2.1, @types/react to ^19.2.7
- Update all @radix-ui packages to React 19-compatible versions
- Update lucide-react, react-day-picker, @phosphor-icons/react
- Regenerate shadcn/ui components for React 19 compatibility
- Update CI workflow to pin wasp installer to v0.20.0
…-nocheck with ts-expect-error

- Pin exact versions for react, react-dom, and @types/react in package.json
- Switch dropdown-menu.tsx icons from lucide-react to @phosphor-icons/react
- Switch sheet.tsx X icon from lucide-react to @phosphor-icons/react
- Replace @ts-nocheck with scoped @ts-expect-error in dropdown-menu and sheet
wardbox added a commit that referenced this pull request Feb 16, 2026
…E placeholder wording

- Remove SubscriptionRoute, CheckoutResultRoute routes
- Remove SubscriptionPage, CheckoutResultPage page definitions
- Remove getPaymentConfig query, createCheckoutSession/createCustomerPortalSession actions
- Remove stripeWebhook API endpoint
- Update README checklist to reference roke.dev instead of example.com

Addresses CodeRabbit review comments on PR #53
@wardbox wardbox force-pushed the chore/strip-payments branch 2 times, most recently from 6a872f8 to 35c5a8c Compare February 16, 2026 18:26
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 7

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
src/client/components/ui/label.tsx (1)

1-27: ⚠️ Potential issue | 🟠 Major

Remove @ts-nocheck and any casts; use proper forwardRef generics instead.

The @ts-nocheck directive plus any casts on ref and props suppress type safety in a shared UI component without resolving the underlying typing issue. As demonstrated in src/client/components/ui/card.tsx, proper typing using React.forwardRef generics eliminates this need:

const Label = React.forwardRef<
  React.ElementRef<typeof LabelPrimitive.Root>,
  React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root> & VariantProps<typeof labelVariants>
>(({ className, ...props }, ref) => (
  <LabelPrimitive.Root
    ref={ref}
    className={cn(labelVariants(), className)}
    {...props}
  />
))

This approach restores compile-time guarantees without suppressions. Also remove the comment on line 1 per coding guidelines (comments should only describe complex logic).

🤖 Fix all issues with AI agents
In `@package.json`:
- Line 62: The package.json currently lists an unused dependency "stripe":
"^18.1.0"; remove that dependency entry from the dependencies block in
package.json and then reinstall to update the lockfile (npm install / yarn
install) so package-lock.json or yarn.lock is updated. If Stripe actually must
remain as a critical dependency, instead pin it to an exact version (e.g.,
"stripe": "18.1.0") rather than a caret range and then reinstall to update the
lockfile; also verify there are no imports of stripe elsewhere before removing.

In `@src/auth/auth.tsx`:
- Line 8: The import currently pulls Link from 'react-router' but the project
standard uses Wasp's Link for internal navigation; update the import statement
that brings in Link (referenced as Link in src/auth/auth.tsx) to import Link
from 'wasp/client/router' so all internal navigation uses the same Wasp router
component.

In `@src/client/components/ui/dropdown-menu.tsx`:
- Line 46: The Phosphor icons in dropdown-menu.tsx are missing the required
weight prop; update the icon components (e.g., CaretRightIcon and any other
Phosphor icon used in this file) to include an explicit weight value (for
example "regular" or "bold") by adding the weight prop to each icon JSX element
so they comply with the coding guidelines and visual consistency.
- Line 1: The leading "// `@ts-expect-error` - React 19 type compatibility issues
with Radix UI" directive in dropdown-menu.tsx should be removed or relocated: if
the import on the next line (the Radix UI import) actually triggers a TypeScript
error, move a bare "@ts-expect-error" directly above that import line; otherwise
delete the directive entirely and also remove the explanatory text so only the
directive remains if needed. Locate the import near the top of the file (in the
dropdown-menu.tsx module) and adjust the directive placement accordingly.

In `@src/client/components/ui/sheet.tsx`:
- Line 1: Move the misplaced comment "// `@ts-expect-error` - React 19 type
compatibility issues" so the lone "// `@ts-expect-error`" directive sits
immediately above the exact statement that causes the TypeScript error (rather
than on its own line), or remove the directive and fix the underlying type
incompatibility; also drop the explanatory text after the directive (comments
should not be used to silence linting/typing explanations) so only "//
`@ts-expect-error`" remains directly above the problematic line.
- Line 75: The Phosphor icon usage is missing an explicit weight: update the
XIcon instance in the sheet component so it includes a weight prop (e.g.,
weight="regular" or weight="bold") alongside the existing size prop; locate the
XIcon element in the Sheet UI component (the close icon render) and add the
appropriate weight value per the design system to satisfy the coding guideline
requiring both size and weight on Phosphor icons.

In `@src/root-components/nav.tsx`:
- Line 1: Remove the file-level "@ts-nocheck" and change the React namespace
import to named imports: import forwardRef and HTMLAttributes from 'react'
(replace any "import * as React" usage), update the component to use forwardRef
directly, and change the props declaration to "interface NavProps extends
HTMLAttributes<HTMLElement>" (ensure any React.* references are replaced with
the named symbols: forwardRef and HTMLAttributes); remove the "@ts-nocheck"
comment afterward.
🧹 Nitpick comments (5)
src/client/components/ui/slider.tsx (1)

1-1: Prefer targeted @ts-expect-error over blanket @ts-nocheck.

Disabling type checking for the entire file can mask unrelated bugs introduced later. Consider using @ts-expect-error on the specific lines with type incompatibilities (lines 16 and 21) to preserve type safety elsewhere in the file.

♻️ Suggested approach
-// `@ts-nocheck` - React 19 type compatibility issues
 import * as React from 'react'
 import * as SliderPrimitive from '@radix-ui/react-slider'

 import { cn } from '../../../lib/utils'

 const Slider = React.forwardRef(
   (
     {
       className,
       ...props
     }: React.ComponentPropsWithoutRef<typeof SliderPrimitive.Root>,
     ref: React.ForwardedRef<React.ElementRef<typeof SliderPrimitive.Root>>,
   ) => (
     <SliderPrimitive.Root
+      // `@ts-expect-error` - React 19 ref type incompatibility with Radix UI
       ref={ref as any}
       className={cn(
         'relative flex w-full touch-none items-center select-none',
         className,
       )}
+      // `@ts-expect-error` - React 19 type incompatibility with Radix UI
       {...(props as any)}
     >
src/root-components/theme-provider.tsx (1)

1-1: Consider using more targeted type suppression instead of @ts-nocheck.

Using @ts-nocheck disables all TypeScript checking for the entire file, which could hide legitimate type errors. This file's code appears straightforward and may not require blanket suppression. Consider:

  1. Using @ts-expect-error on specific lines where type issues occur
  2. Adding proper type definitions or declarations
  3. Using type assertions where needed

If React 19 compatibility is the concern, pinpoint the exact lines causing issues.

src/root-components/footer.tsx (1)

1-1: Consider using Wasp's Link component for internal navigation.

Similar to src/auth/auth.tsx, this file imports Link from react-router instead of wasp/client/router as specified in the coding guidelines.

-import { Link } from 'react-router'
+import { Link } from 'wasp/client/router'

As per coding guidelines: "Use Wasp's built-in Link component from wasp/client/router for internal links."

src/root-components/toast.tsx (2)

91-91: Add weight prop to Phosphor icon.

Per coding guidelines, Phosphor icons should include both size and weight props.

-    <XIcon size={16} />
+    <XIcon size={16} weight='bold' />

As per coding guidelines: "Phosphor icons should be used with size and weight props (e.g., size={24} weight='fill')."


85-85: Consider using semantic color names instead of raw color values.

The ToastClose styles use non-semantic Tailwind colors (text-red-300, text-blue-300, text-green-300, text-yellow-300). The coding guidelines prefer semantic color naming.

However, since these are variant-specific colors tied to toast types (destructive, info, success, warning), and the theme may not define semantic equivalents for all these states, this might be intentional. Verify if semantic alternatives exist in your theme configuration.

As per coding guidelines: "Use Tailwind CSS with semantic color naming (e.g., text-destructive not text-red-500)."

Comment thread package.json Outdated
Comment thread src/auth/auth.tsx Outdated
Comment thread src/client/components/ui/dropdown-menu.tsx Outdated
Comment thread src/client/components/ui/dropdown-menu.tsx Outdated
Comment thread src/client/components/ui/sheet.tsx Outdated
Comment thread src/client/components/ui/sheet.tsx Outdated
Comment thread src/root-components/nav.tsx Outdated
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In `@src/client/components/ui/dropdown-menu.tsx`:
- Around line 1-4: Remove the namespace import "import * as React from 'react'"
and instead import the specific hooks/types you use (e.g., import { forwardRef,
type ForwardedRef, type ComponentPropsWithoutRef, type ElementRef, type
ReactNode } from 'react'); then replace all React.forwardRef usages with
forwardRef and swap any React.* type references (e.g.,
React.ComponentPropsWithoutRef, React.ElementRef, React.ReactNode) to the
corresponding named type imports (ComponentPropsWithoutRef, ElementRef,
ReactNode or ForwardedRef) so the components and their types (e.g., any
occurrences in DropdownMenu, DropdownMenuItem, DropdownMenuTrigger, the
forwardRef callbacks and ref type annotations) compile without the namespace
import.
🧹 Nitpick comments (4)
src/client/components/ui/label.tsx (2)

4-5: Add a description to the @ts-expect-error directive.

The directive should include a description explaining what error is being suppressed and why (e.g., React 19 type compatibility with Radix UI). This aids future maintenance and helps identify when the suppression is no longer needed.

📝 Proposed fix
-// `@ts-expect-error`
+// `@ts-expect-error` - `@radix-ui/react-label` types not yet compatible with React 19
 import * as LabelPrimitive from '@radix-ui/react-label'

3-3: Consider using named imports instead of namespace import.

Per coding guidelines, prefer direct named imports from React. The namespace import can be refactored since only specific types and forwardRef are used.

♻️ Proposed refactor
-import * as React from 'react'
+import { forwardRef, type ElementRef, type ComponentPropsWithoutRef } from 'react'

Then update the component definition:

-const Label = React.forwardRef<
-  React.ElementRef<typeof LabelPrimitive.Root>,
-  React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root> &
+const Label = forwardRef<
+  ElementRef<typeof LabelPrimitive.Root>,
+  ComponentPropsWithoutRef<typeof LabelPrimitive.Root> &
     VariantProps<typeof labelVariants>
src/client/components/ui/sheet.tsx (2)

1-5: Prefer direct imports over React namespace import.

The namespace import import * as React from 'react' can be refactored to use direct imports, aligning with coding guidelines. The code uses forwardRef, ComponentPropsWithoutRef, ForwardedRef, and ElementRef.

♻️ Proposed refactor to use direct imports
-import * as React from 'react'
+import {
+  forwardRef,
+  type ComponentPropsWithoutRef,
+  type ForwardedRef,
+  type ElementRef,
+} from 'react'
 // `@ts-expect-error`
 import * as SheetPrimitive from '@radix-ui/react-dialog'
 import { cva, type VariantProps } from 'class-variance-authority'
 import { XIcon } from '@phosphor-icons/react'

Then update the component signatures (example for SheetOverlay):

-const SheetOverlay = React.forwardRef(
+const SheetOverlay = forwardRef(
   (
     {
       className,
       ...props
-    }: React.ComponentPropsWithoutRef<typeof SheetPrimitive.Overlay>,
-    ref: React.ForwardedRef<React.ElementRef<typeof SheetPrimitive.Overlay>>,
+    }: ComponentPropsWithoutRef<typeof SheetPrimitive.Overlay>,
+    ref: ForwardedRef<ElementRef<typeof SheetPrimitive.Overlay>>,
   ) => (

Apply similar changes to SheetContent, SheetTitle, and SheetDescription.

As per coding guidelines: "Do not import React from 'react' because it's automatically imported in JSX files" and "Import React hooks directly from packages".


17-34: Consider removing or investigating the as any casts and @ts-expect-error workaround.

The as any casts at lines 30-31, 69, 71, 121, 123, 140, 142 and the @ts-expect-error on line 2 were workarounds for React 19 + Radix UI type incompatibilities. However, Radix Primitives achieved full React 19 compatibility as of June 2024, and the project is already using @radix-ui/react-dialog@1.1.15 (the current latest) with React 19.2.1. These workarounds may no longer be necessary and could potentially be removed after verifying that type checking passes without them.

Comment thread src/client/components/ui/dropdown-menu.tsx Outdated
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 4

🤖 Fix all issues with AI agents
In `@package.json`:
- Around line 54-56: The package.json uses caret ranges for critical
dependencies (react, react-dom, react-router, tailwindcss, `@tailwindcss/vite`)
which must be pinned to exact versions; update the version strings for "react",
"react-dom", "react-router", "tailwindcss", and "@tailwindcss/vite" in
package.json to remove the caret (e.g., change "^19.2.1" to "19.2.1"), run your
package manager to update the lockfile, and commit the updated package.json and
lockfile so the exact versions are enforced.
- Line 12: Update package.json to pin the icon dependency and remove the unused
one: replace the caret version for "@phosphor-icons/react" with the exact
version string "2.1.10" (remove the leading ^) and delete the "lucide-react"
dependency entry entirely since it has no imports; then run your package manager
to update lockfiles. Target the package.json entries named
"@phosphor-icons/react" and "lucide-react" when making these edits.
- Around line 5-6: The package.json currently uses caret ranges for critical
dependencies—update the dependency entries for react, react-dom, react-router
(or react-router-dom if present), and tailwindcss to exact versions (e.g.,
change "^19.2.1" to "19.2.1") to comply with the project's stability guideline;
also audit the dependencies list for lucide-react and `@phosphor-icons/react` and
remove whichever icon package is unused (or consolidate imports) to reduce
maintenance surface, ensuring you update package.json dependency names (react,
react-dom, react-router(-dom), tailwindcss, lucide-react, `@phosphor-icons/react`)
and run dependency install/lockfile update afterwards.
- Line 11: Update the three critical dependencies in package.json to exact
versions by removing the caret (^) from their version strings: change
"@hookform/resolvers": "^5.0.1" to "5.0.1", "react-day-picker": "^9.13.2" to
"9.13.2", and "vite": "^7.0.6" to "7.0.6"; ensure these exact-version strings
replace the caret ranges for the keys "@hookform/resolvers", "react-day-picker",
and "vite" respectively so npm/yarn will pin those dependency versions.
🧹 Nitpick comments (4)
src/client/components/ui/sheet.tsx (4)

60-80: Same refactor applies: replace as any with proper generics.

Lines 68 and 70 use as any casts. Apply the same pattern suggested for SheetOverlay.

♻️ Suggested refactor
-const SheetContent = React.forwardRef(
-  (
-    { side = 'right', className, children, ...props }: SheetContentProps,
-    ref: React.ForwardedRef<React.ElementRef<typeof SheetPrimitive.Content>>,
-  ) => (
+const SheetContent = React.forwardRef<
+  React.ElementRef<typeof SheetPrimitive.Content>,
+  SheetContentProps
+>(({ side = 'right', className, children, ...props }, ref) => (
     <SheetPortal>
       <SheetOverlay />
       <SheetPrimitive.Content
-        ref={ref as any}
+        ref={ref}
         className={cn(sheetVariants({ side }), className)}
-        {...(props as any)}
+        {...props}
       >
         {children}
         <SheetPrimitive.Close className='ring-offset-background focus:ring-ring data-[state=open]:bg-secondary absolute top-4 right-4 rounded-sm opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-none disabled:pointer-events-none'>
           <XIcon size={16} weight='bold' />
           <span className='sr-only'>Close</span>
         </SheetPrimitive.Close>
       </SheetPrimitive.Content>
     </SheetPortal>
-  ),
-)
+))

111-144: Apply consistent forwardRef pattern to SheetTitle and SheetDescription.

Both components use the same as any cast pattern on lines 120, 122, 139, and 141. Refactor to proper generics for consistency and type safety.

♻️ Suggested refactor for SheetTitle
-const SheetTitle = React.forwardRef(
-  (
-    {
-      className,
-      ...props
-    }: React.ComponentPropsWithoutRef<typeof SheetPrimitive.Title>,
-    ref: React.ForwardedRef<React.ElementRef<typeof SheetPrimitive.Title>>,
-  ) => (
-    <SheetPrimitive.Title
-      ref={ref as any}
-      className={cn('text-foreground text-lg font-semibold', className)}
-      {...(props as any)}
-    />
-  ),
-)
+const SheetTitle = React.forwardRef<
+  React.ElementRef<typeof SheetPrimitive.Title>,
+  React.ComponentPropsWithoutRef<typeof SheetPrimitive.Title>
+>(({ className, ...props }, ref) => (
+  <SheetPrimitive.Title
+    ref={ref}
+    className={cn('text-foreground text-lg font-semibold', className)}
+    {...props}
+  />
+))
♻️ Suggested refactor for SheetDescription
-const SheetDescription = React.forwardRef(
-  (
-    {
-      className,
-      ...props
-    }: React.ComponentPropsWithoutRef<typeof SheetPrimitive.Description>,
-    ref: React.ForwardedRef<
-      React.ElementRef<typeof SheetPrimitive.Description>
-    >,
-  ) => (
-    <SheetPrimitive.Description
-      ref={ref as any}
-      className={cn('text-muted-foreground text-sm', className)}
-      {...(props as any)}
-    />
-  ),
-)
+const SheetDescription = React.forwardRef<
+  React.ElementRef<typeof SheetPrimitive.Description>,
+  React.ComponentPropsWithoutRef<typeof SheetPrimitive.Description>
+>(({ className, ...props }, ref) => (
+  <SheetPrimitive.Description
+    ref={ref}
+    className={cn('text-muted-foreground text-sm', className)}
+    {...props}
+  />
+))

45-46: Nitpick: Double space in class string.

There's an extra space before border-l on line 46.

✏️ Suggested fix
-        'inset-y-0 right-0 h-full w-3/4  border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm',
+        'inset-y-0 right-0 h-full w-3/4 border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm',

16-33: Use proper forwardRef generics instead of as any casts to maintain type safety.

The as any casts on props and ref (lines 29-30) disable type checking entirely. TypeScript's forwardRef generics pattern preserves type inference without sacrificing safety. Consider this refactor:

♻️ Suggested refactor
-const SheetOverlay = React.forwardRef(
-  (
-    {
-      className,
-      ...props
-    }: React.ComponentPropsWithoutRef<typeof SheetPrimitive.Overlay>,
-    ref: React.ForwardedRef<React.ElementRef<typeof SheetPrimitive.Overlay>>,
-  ) => (
-    <SheetPrimitive.Overlay
-      className={cn(
-        'data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/80',
-        className,
-      )}
-      {...(props as any)}
-      ref={ref as any}
-    />
-  ),
-)
+const SheetOverlay = React.forwardRef<
+  React.ElementRef<typeof SheetPrimitive.Overlay>,
+  React.ComponentPropsWithoutRef<typeof SheetPrimitive.Overlay>
+>(({ className, ...props }, ref) => (
+  <SheetPrimitive.Overlay
+    className={cn(
+      'data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/80',
+      className,
+    )}
+    {...props}
+    ref={ref}
+  />
+))

Comment thread package.json
Comment on lines +5 to +6
".wasp/out/*",
".wasp/out/sdk/wasp"
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

🏁 Script executed:

cat package.json

Repository: wardbox/roke

Length of output: 2771


Use exact versions for critical dependencies.

Dependencies like react, react-dom, react-router, and tailwindcss are critical for stability and should use exact versions (e.g., "react": "19.2.1") rather than caret ranges. This aligns with the project's coding guidelines. Currently, these use ^19.2.1, ^19.2.1, ^7.12.0, and ^4.0.0 respectively, which allow breaking changes within major versions.

Additionally, both lucide-react and @phosphor-icons/react are listed as dependencies. Verify that both are actively used; if one is being phased out, remove it to reduce maintenance surface.

Note: The workspace paths .wasp/out/* and .wasp/out/sdk/wasp are not redundant—the glob pattern matches only direct children, while the second entry targets a specific nested workspace.

🤖 Prompt for AI Agents
In `@package.json` around lines 5 - 6, The package.json currently uses caret
ranges for critical dependencies—update the dependency entries for react,
react-dom, react-router (or react-router-dom if present), and tailwindcss to
exact versions (e.g., change "^19.2.1" to "19.2.1") to comply with the project's
stability guideline; also audit the dependencies list for lucide-react and
`@phosphor-icons/react` and remove whichever icon package is unused (or
consolidate imports) to reduce maintenance surface, ensuring you update
package.json dependency names (react, react-dom, react-router(-dom),
tailwindcss, lucide-react, `@phosphor-icons/react`) and run dependency
install/lockfile update afterwards.

Comment thread package.json Outdated
"dependencies": {
"@anthropic-ai/sdk": "^0.32.1",
"@fontsource-variable/inter": "^5.2.5",
"@hookform/resolvers": "^5.0.1",
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🏁 Script executed:

cat -n package.json

Repository: wardbox/roke

Length of output: 3352


🌐 Web query:

react-day-picker v9 React 19 compatibility

💡 Result:

react-day-picker v9 works with React 19, but you should use v9.4.3 or newer for best React 19 TypeScript/type-attribute compatibility (v9.4.3 explicitly “enhances compatibility with React 19”). [1]

If you see npm ERESOLVE / peer dependency install failures in a React 19 app, they’re often caused by other packages in your dependency tree (not React DayPicker itself). For example, one reported failure came from vaul@0.9.9 not allowing React 19 peers. [2]

If you’re hitting this via shadcn/ui’s calendar, note that older setups used react-day-picker@8.10.1 (React 18 peer range) and will conflict with React 19—upgrading to react-day-picker v9 is the intended fix. [3]

Recommended: install/upgrade to the latest v9 and, if TypeScript complains with React 19 types, ensure you’re on ≥ 9.4.3. [1]

Sources: [1] React DayPicker changelog (v9.4.3) • [2] npm/cli issue about React 19 install conflict via another dependency • [3] shadcn-ui issue about react-day-picker@8.10.1 failing under React 19


🌐 Web query:

@hookform/resolvers v5 react-hook-form v7 compatibility

💡 Result:

@hookform/resolvers v5 is compatible with react-hook-form v7, but only with react-hook-form ≥ 7.55.0 (v5.0.0 introduced this as a breaking change; v5.0.1 relaxed the constraint to ^7.55.0). (github.com)

If you’re on an older RHF v7 (e.g., 7.54.x or below), you should stay on @hookform/resolvers v4.x or upgrade react-hook-form to ≥ 7.55.0. (github.com)

Also note: resolvers v5 added separate input/output typing for schemas (use useForm<Input, Context, Output>() or let types infer from the schema), so old patterns like useForm<FormValues>() may cause TypeScript mismatches for schemas with transforms/coercions. (github.com)

Citations:


🌐 Web query:

Vite v7 release version

💡 Result:

Vite v7 was released as Vite 7.0 (v7.0.0) on June 24, 2025. [1] [2]


Use exact versions for critical dependencies in package.json.

The compatibility between these major versions is fine (react-day-picker v9.13.2 works with React 19, @hookform/resolvers v5.0.1 is compatible with react-hook-form v7.56.4, and Vite v7.0.6 is a valid release). However, all three lines violate the coding guideline by using caret ranges (^) instead of exact versions:

  • Line 11: "@hookform/resolvers": "^5.0.1""@hookform/resolvers": "5.0.1"
  • Line 55: "react-day-picker": "^9.13.2""react-day-picker": "9.13.2"
  • Line 77: "vite": "^7.0.6""vite": "7.0.6"

Pin these to exact versions to prevent unexpected minor/patch updates in critical dependencies.

🤖 Prompt for AI Agents
In `@package.json` at line 11, Update the three critical dependencies in
package.json to exact versions by removing the caret (^) from their version
strings: change "@hookform/resolvers": "^5.0.1" to "5.0.1", "react-day-picker":
"^9.13.2" to "9.13.2", and "vite": "^7.0.6" to "7.0.6"; ensure these
exact-version strings replace the caret ranges for the keys
"@hookform/resolvers", "react-day-picker", and "vite" respectively so npm/yarn
will pin those dependency versions.

Comment thread package.json Outdated
"@radix-ui/react-toggle": "^1.1.8",
"@radix-ui/react-toggle-group": "^1.1.9",
"@radix-ui/react-tooltip": "^1.2.6",
"@phosphor-icons/react": "^2.1.10",
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Check for lucide-react and `@phosphor-icons` imports

echo "=== Searching for lucide-react imports ==="
rg -n "lucide-react" -g '*.{ts,tsx,js,jsx}' 2>/dev/null || echo "No matches found"

echo ""
echo "=== Searching for `@phosphor-icons` imports ==="
rg -n "@phosphor-icons" -g '*.{ts,tsx,js,jsx}' 2>/dev/null || echo "No matches found"

echo ""
echo "=== Checking package.json for icon libraries ==="
cat package.json | grep -A 1 -B 1 "lucide\|phosphor"

Repository: wardbox/roke

Length of output: 1327


🏁 Script executed:

# Check the full package.json to see version constraints
cat package.json

Repository: wardbox/roke

Length of output: 2771


Remove lucide-react and use exact versions for both icon libraries.

The migration to @phosphor-icons/react is complete—lucide-react has no imports in the codebase and should be removed to reduce bundle size. Additionally, both @phosphor-icons/react (line 12) and the now-unused lucide-react (line 48) must use exact versions per the coding guidelines for critical dependencies:

"@phosphor-icons/react": "2.1.10",

Remove lucide-react entirely from package.json.

🤖 Prompt for AI Agents
In `@package.json` at line 12, Update package.json to pin the icon dependency and
remove the unused one: replace the caret version for "@phosphor-icons/react"
with the exact version string "2.1.10" (remove the leading ^) and delete the
"lucide-react" dependency entry entirely since it has no imports; then run your
package manager to update lockfiles. Target the package.json entries named
"@phosphor-icons/react" and "lucide-react" when making these edits.

Comment thread package.json
Comment on lines +54 to +56
"react": "^19.2.1",
"react-day-picker": "^9.13.2",
"react-dom": "^19.2.1",
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Critical dependencies should use exact versions.

Per coding guidelines, critical dependencies should use exact versions. The following core framework dependencies use caret ranges which could introduce breaking changes on minor/patch updates:

Dependency Current Suggested
react ^19.2.1 19.2.1
react-dom ^19.2.1 19.2.1
react-router ^7.12.0 7.12.0
tailwindcss ^4.0.0 4.0.0
@tailwindcss/vite ^4.0.0 4.0.0
Suggested fix to pin critical dependencies
-    "react": "^19.2.1",
+    "react": "19.2.1",
-    "react-dom": "^19.2.1",
+    "react-dom": "19.2.1",
-    "react-router": "^7.12.0",
+    "react-router": "7.12.0",
...
-    "@tailwindcss/vite": "^4.0.0",
+    "@tailwindcss/vite": "4.0.0",
...
-    "tailwindcss": "^4.0.0",
+    "tailwindcss": "4.0.0",

As per coding guidelines: "Use exact versions for critical dependencies".

Also applies to: 59-59, 69-69, 75-75

🤖 Prompt for AI Agents
In `@package.json` around lines 54 - 56, The package.json uses caret ranges for
critical dependencies (react, react-dom, react-router, tailwindcss,
`@tailwindcss/vite`) which must be pinned to exact versions; update the version
strings for "react", "react-dom", "react-router", "tailwindcss", and
"@tailwindcss/vite" in package.json to remove the caret (e.g., change "^19.2.1"
to "19.2.1"), run your package manager to update the lockfile, and commit the
updated package.json and lockfile so the exact versions are enforced.

Adds documentation regarding dependency versioning strategy,
explicitly highlighting versions that need to keep `^` prefix.

Also, tightens version constraints for some dependencies, aiming
for stability and predictability in the absence of payment-related features.
@wardbox wardbox merged commit f272b98 into main Feb 16, 2026
2 checks passed
@wardbox wardbox deleted the chore/strip-payments branch February 16, 2026 19:54
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants