Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Conversation

@steven-tey
Copy link
Collaborator

@steven-tey steven-tey commented Nov 7, 2025

Summary by CodeRabbit

  • Improvements

    • Added paste handling for website URLs in partner application forms with sanitization.
    • Adjusted partner invitation email layout for improved readability.
    • Dashboard share page now shows a proper “not found” response when a shared dashboard is missing.
  • Refactor

    • Formatting standardization and import reorganization across many pages and components for consistency.

@vercel
Copy link
Contributor

vercel bot commented Nov 7, 2025

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Preview Updated (UTC)
dub Error Error Nov 7, 2025 6:39pm

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Nov 7, 2025

Warning

Rate limit exceeded

@steven-tey has exceeded the limit for the number of commits or files that can be reviewed per hour. Please wait 27 minutes and 54 seconds before requesting another review.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

📥 Commits

Reviewing files that changed from the base of the PR and between 16f71a3 and b16b5cd.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (58)
  • apps/web/app/(ee)/api/cron/links/[linkId]/complete-tests/route.ts (1 hunks)
  • apps/web/app/(ee)/api/mock/rewardful/campaigns/[campaignId]/route.ts (1 hunks)
  • apps/web/app/(ee)/app.dub.co/embed/referrals/page.tsx (1 hunks)
  • apps/web/app/(ee)/app.dub.co/embed/referrals/utils.ts (1 hunks)
  • apps/web/app/(ee)/partners.dub.co/(auth)/auth/reset-password/[token]/page.tsx (1 hunks)
  • apps/web/app/(ee)/partners.dub.co/(auth)/register/page.tsx (1 hunks)
  • apps/web/app/(ee)/partners.dub.co/(onboarding)/onboarding/online-presence/page.tsx (1 hunks)
  • apps/web/app/(ee)/partners.dub.co/(redirects)/apply/[programSlug]/[[...slug]]/page.tsx (1 hunks)
  • apps/web/app/[domain]/not-found/page.tsx (1 hunks)
  • apps/web/app/[domain]/page.tsx (1 hunks)
  • apps/web/app/[domain]/stats/[key]/page.tsx (1 hunks)
  • apps/web/app/api/links/route.ts (1 hunks)
  • apps/web/app/api/og/avatar/[[...seed]]/route.tsx (1 hunks)
  • apps/web/app/app.dub.co/(auth)/auth/reset-password/[token]/page.tsx (1 hunks)
  • apps/web/app/app.dub.co/(dashboard)/[slug]/(ee)/program/campaigns/campaign-type-icon.tsx (0 hunks)
  • apps/web/app/app.dub.co/(dashboard)/[slug]/(ee)/program/partners/applications/rejected/page.tsx (1 hunks)
  • apps/web/app/app.dub.co/(dashboard)/[slug]/links/folders/[folderId]/members/page.tsx (1 hunks)
  • apps/web/app/app.dub.co/(dashboard)/[slug]/settings/(basic-layout)/integrations/[integrationSlug]/manage/page.tsx (1 hunks)
  • apps/web/app/app.dub.co/(dashboard)/[slug]/settings/(basic-layout)/integrations/[integrationSlug]/page.tsx (1 hunks)
  • apps/web/app/app.dub.co/(dashboard)/[slug]/settings/(basic-layout)/integrations/enabled/page.tsx (1 hunks)
  • apps/web/app/app.dub.co/(dashboard)/[slug]/settings/(basic-layout)/integrations/new/page.tsx (1 hunks)
  • apps/web/app/app.dub.co/(dashboard)/[slug]/settings/oauth-apps/[appId]/page.tsx (1 hunks)
  • apps/web/app/app.dub.co/(dashboard)/[slug]/settings/webhooks/[webhookId]/edit/page.tsx (1 hunks)
  • apps/web/app/app.dub.co/(dashboard)/[slug]/settings/webhooks/[webhookId]/layout.tsx (1 hunks)
  • apps/web/app/app.dub.co/(dashboard)/[slug]/settings/webhooks/[webhookId]/page.tsx (1 hunks)
  • apps/web/app/app.dub.co/(deeplink)/deeplink/[domain]/[key]/page.tsx (1 hunks)
  • apps/web/app/app.dub.co/(onboarding)/[slug]/wrapped/[year]/page.tsx (1 hunks)
  • apps/web/app/app.dub.co/(onboarding)/[slug]/wrapped/page.tsx (1 hunks)
  • apps/web/app/app.dub.co/(redirects)/[slug]/domains/page.tsx (1 hunks)
  • apps/web/app/app.dub.co/(redirects)/[slug]/settings/tags/page.tsx (1 hunks)
  • apps/web/app/app.dub.co/(redirects)/analytics/page.tsx (1 hunks)
  • apps/web/app/app.dub.co/(redirects)/links/[key]/page.tsx (1 hunks)
  • apps/web/app/app.dub.co/(share)/share/[dashboardId]/page.tsx (3 hunks)
  • apps/web/app/cloaked/[url]/page.tsx (2 hunks)
  • apps/web/app/inspect/[domain]/[key]/page.tsx (2 hunks)
  • apps/web/app/password/[linkId]/page.tsx (2 hunks)
  • apps/web/app/proxy/[domain]/[key]/page.tsx (2 hunks)
  • apps/web/app/wellknown/[domain]/[file]/route.ts (1 hunks)
  • apps/web/lib/actions/partners/create-reward.ts (1 hunks)
  • apps/web/lib/actions/partners/online-presence-providers.ts (1 hunks)
  • apps/web/lib/actions/partners/update-reward.ts (1 hunks)
  • apps/web/lib/api/domains/get-email-domain-or-throw.ts (0 hunks)
  • apps/web/lib/api/links/bulk-delete-links.ts (1 hunks)
  • apps/web/lib/api/workflows/render-campaign-email-markdown.ts (1 hunks)
  • apps/web/lib/rewardful/api.ts (1 hunks)
  • apps/web/lib/zod/schemas/program-application-form.ts (6 hunks)
  • apps/web/package.json (0 hunks)
  • apps/web/scripts/testimonial/update-commissions.ts (1 hunks)
  • apps/web/ui/partners/bounties/claim-bounty-modal.tsx (1 hunks)
  • apps/web/ui/partners/groups/design/application-form/fields/max-character-count.tsx (1 hunks)
  • apps/web/ui/partners/groups/design/application-form/fields/website-and-socials-field.tsx (4 hunks)
  • package.json (2 hunks)
  • packages/email/src/templates/invalid-domain.tsx (1 hunks)
  • packages/email/src/templates/partner-user-invited.tsx (1 hunks)
  • packages/embeds/react/src/example/app.tsx (1 hunks)
  • packages/stripe-app/package.json (0 hunks)
  • packages/ui/src/hooks/use-enter-submit.ts (1 hunks)
  • packages/ui/src/icons/nucleo/arrow-turn-left.tsx (1 hunks)

Walkthrough

Mostly stylistic edits across the codebase: reflowed function signatures, import reordering/consolidation, whitespace/trailing-comma fixes, small schema formatting, plus two targeted behavioral tweaks (share page now calls notFound(); website paste sanitized).

Changes

Cohort / File(s) Summary
Signature formatting (pages & routes)
apps/web/app/(ee)/api/cron/links/[linkId]/complete-tests/route.ts, apps/web/app/(ee)/api/mock/rewardful/campaigns/[campaignId]/route.ts, apps/web/app/(ee)/app.dub.co/embed/referrals/page.tsx, apps/web/app/(ee)/partners.dub.co/(auth)/auth/reset-password/[token]/page.tsx, apps/web/app/(ee)/partners.dub.co/(auth)/register/page.tsx, apps/web/app/(ee)/partners.dub.co/(onboarding)/onboarding/online-presence/page.tsx, apps/web/app/(ee)/partners.dub.co/(redirects)/apply/[programSlug]/[[...slug]]/page.tsx, apps/web/app/[domain]/not-found/page.tsx, apps/web/app/[domain]/page.tsx, apps/web/app/[domain]/stats/[key]/page.tsx, apps/web/app/api/og/avatar/[[...seed]]/route.tsx, apps/web/app/app.dub.co/(auth)/auth/reset-password/[token]/page.tsx, apps/web/app/app.dub.co/(dashboard)/[slug]/(ee)/program/partners/applications/rejected/page.tsx, apps/web/app/app.dub.co/(dashboard)/[slug]/links/folders/[folderId]/members/page.tsx, apps/web/app/app.dub.co/(dashboard)/[slug]/settings/(basic-layout)/integrations/*, apps/web/app/app.dub.co/(dashboard)/[slug]/settings/oauth-apps/[appId]/page.tsx, apps/web/app/app.dub.co/(dashboard)/[slug]/settings/webhooks/*, apps/web/app/app.dub.co/(deeplink)/deeplink/[domain]/[key]/page.tsx, apps/web/app/app.dub.co/(onboarding)/[slug]/wrapped*/page.tsx, apps/web/app/app.dub.co/(redirects)/*, apps/web/app/app.dub.co/(share)/share/[dashboardId]/page.tsx, apps/web/app/cloaked/[url]/page.tsx, apps/web/app/inspect/[domain]/[key]/page.tsx, apps/web/app/password/[linkId]/page.tsx, apps/web/app/proxy/[domain]/[key]/page.tsx, apps/web/app/wellknown/[domain]/[file]/route.ts
Reflowed function parameter/signature formatting (multi-line ↔ inline), minor trailing-comma adjustments. Signatures/types preserved; mostly cosmetic.
Import reordering / consolidation
apps/web/app/(ee)/app.dub.co/embed/referrals/utils.ts, apps/web/app/api/links/route.ts, apps/web/lib/actions/partners/create-reward.ts, apps/web/lib/actions/partners/update-reward.ts, apps/web/lib/rewardful/api.ts, apps/web/scripts/testimonial/update-commissions.ts, packages/embeds/react/src/example/app.tsx
Removed duplicate imports, reordered imports or consolidated import lines; no identifier or runtime semantics changed.
Whitespace / formatting fixes
apps/web/app/app.dub.co/(dashboard)/[slug]/(ee)/program/partners/applications/rejected/page.tsx, apps/web/lib/actions/partners/online-presence-providers.ts, apps/web/lib/api/domains/get-email-domain-or-throw.ts, apps/web/lib/api/links/bulk-delete-links.ts, apps/web/lib/api/workflows/render-campaign-email-markdown.ts, packages/ui/src/hooks/use-enter-submit.ts
Trailing-newline, blank-line and minor formatting cleanups; no behavior changes.
Schema formatting & composition
apps/web/lib/zod/schemas/program-application-form.ts
Reworked union/array formatting, introduced explicit WithValue variants and adjusted discriminated union composition; public schema names/types preserved.
Behavioral tweak — share page
apps/web/app/app.dub.co/(share)/share/[dashboardId]/page.tsx
When dashboard link data is missing, code now calls notFound() (404) instead of returning early; signature also reformatted.
UI: paste handling & component props
apps/web/ui/partners/groups/design/application-form/fields/website-and-socials-field.tsx, apps/web/ui/partners/groups/design/application-form/fields/max-character-count.tsx
Added onPasteWebsite handler to sanitize pasted website values before setValue; MaxCharacterCount props destructured with typed object and minor className formatting changes.
Other minor edits & package metadata
apps/web/lib/actions/partners/create-reward.ts, apps/web/lib/actions/partners/update-reward.ts, apps/web/lib/rewardful/api.ts, apps/web/scripts/testimonial/update-commissions.ts, packages/email/src/templates/partner-user-invited.tsx, apps/web/package.json, package.json, packages/stripe-app/package.json
Import order tweaks, small JSX text layout change, removal/addition of pnpm/resolution fields and addition of devDependency patch-package.

Sequence Diagram(s)

sequenceDiagram
  participant Browser
  participant DashboardPage
  participant DataLayer
  Note over DashboardPage,DataLayer `#D6EAF8`: New behaviour — call notFound() if data missing
  Browser->>DashboardPage: GET /share/[dashboardId]
  DashboardPage->>DataLayer: fetchDashboardLink(dashboardId)
  alt link found
    DataLayer-->>DashboardPage: link data
    DashboardPage-->>Browser: render page
  else link missing
    DataLayer-->>DashboardPage: null
    DashboardPage-->>DashboardPage: notFound()
    DashboardPage-->>Browser: 404 response
  end
Loading
sequenceDiagram
  participant User
  participant WebsiteField
  participant FormState
  Note over WebsiteField,FormState `#FDEBD0`: New onPasteWebsite sanitizes input before state update
  User->>WebsiteField: paste text
  WebsiteField->>WebsiteField: sanitizeWebsite(pasted)
  WebsiteField->>FormState: setValue(sanitized)
  FormState-->>WebsiteField: state updated
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

  • Rationale: many files changed but most edits are low-risk formatting; a few files include behavioral or schema composition changes requiring attention.
  • Files needing extra attention:
    • apps/web/app/app.dub.co/(share)/share/[dashboardId]/page.tsx — verify notFound() correctly integrates with routing/caching.
    • apps/web/ui/partners/groups/design/application-form/fields/website-and-socials-field.tsx — verify sanitizeWebsite behavior and paste edge cases.
    • apps/web/lib/zod/schemas/program-application-form.ts — ensure validation equivalence after schema restructuring.
    • package.json / apps/web/package.json / packages/stripe-app/package.json — confirm dependency/resolution intent.

Possibly related PRs

Suggested reviewers

  • devkiran

Poem

🐰 Hopped through the repo, neat and spry,
Signatures aligned, commas waved hi.
Imports tidied, schemas set right,
Paste is sanitized, missing links get light.
A small tidy hop — code sleeps well tonight.

Pre-merge checks and finishing touches

❌ Failed checks (1 warning, 1 inconclusive)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 6.67% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
Title check ❓ Inconclusive The title 'Fix prettier' is vague and generic, using a non-descriptive term that doesn't convey meaningful information about what was actually changed in the pull request. Consider using a more specific title that describes the actual changes, such as 'Reformat code with prettier' or 'Apply prettier formatting fixes' to better convey the changeset's intent.
✅ Passed checks (1 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.

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 and usage tips.

Copy link
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

🧹 Nitpick comments (2)
apps/web/app/api/links/route.ts (1)

56-56: Optional: Remove debug console.log statement.

While not introduced by this PR, this debug console.log statement should ideally be removed before production. It may expose sensitive link data in logs and can clutter server output.

Apply this diff to remove the debug statement:

-    console.log(body);
-
     if (!session) {
apps/web/lib/zod/schemas/program-application-form.ts (1)

113-118: Redundant field redefinition in schema extension.

Lines 115-116 explicitly redefine id and type fields already inherited from the parent schema in the .extend() call. While valid Zod syntax, this is redundant and reduces clarity.

Simplify by removing the redundant redefinitions:

 export const programApplicationFormWebsiteAndSocialsFieldWithValueSchema =
   programApplicationFormWebsiteAndSocialsFieldSchema.extend({
-    id: z.string(),
-    type: z.literal("website-and-socials"),
     data: z.array(programApplicationFormSiteSchemaWithValue),
   });
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 16f71a3 and 22d6684.

📒 Files selected for processing (53)
  • apps/web/app/(ee)/api/cron/links/[linkId]/complete-tests/route.ts (1 hunks)
  • apps/web/app/(ee)/api/mock/rewardful/campaigns/[campaignId]/route.ts (1 hunks)
  • apps/web/app/(ee)/app.dub.co/embed/referrals/page.tsx (1 hunks)
  • apps/web/app/(ee)/app.dub.co/embed/referrals/utils.ts (1 hunks)
  • apps/web/app/(ee)/partners.dub.co/(auth)/auth/reset-password/[token]/page.tsx (1 hunks)
  • apps/web/app/(ee)/partners.dub.co/(auth)/register/page.tsx (1 hunks)
  • apps/web/app/(ee)/partners.dub.co/(onboarding)/onboarding/online-presence/page.tsx (1 hunks)
  • apps/web/app/(ee)/partners.dub.co/(redirects)/apply/[programSlug]/[[...slug]]/page.tsx (1 hunks)
  • apps/web/app/[domain]/not-found/page.tsx (1 hunks)
  • apps/web/app/[domain]/page.tsx (1 hunks)
  • apps/web/app/[domain]/stats/[key]/page.tsx (1 hunks)
  • apps/web/app/api/links/route.ts (1 hunks)
  • apps/web/app/api/og/avatar/[[...seed]]/route.tsx (1 hunks)
  • apps/web/app/app.dub.co/(auth)/auth/reset-password/[token]/page.tsx (1 hunks)
  • apps/web/app/app.dub.co/(dashboard)/[slug]/(ee)/program/campaigns/campaign-type-icon.tsx (0 hunks)
  • apps/web/app/app.dub.co/(dashboard)/[slug]/(ee)/program/partners/applications/rejected/page.tsx (1 hunks)
  • apps/web/app/app.dub.co/(dashboard)/[slug]/links/folders/[folderId]/members/page.tsx (1 hunks)
  • apps/web/app/app.dub.co/(dashboard)/[slug]/settings/(basic-layout)/integrations/[integrationSlug]/manage/page.tsx (1 hunks)
  • apps/web/app/app.dub.co/(dashboard)/[slug]/settings/(basic-layout)/integrations/[integrationSlug]/page.tsx (1 hunks)
  • apps/web/app/app.dub.co/(dashboard)/[slug]/settings/(basic-layout)/integrations/enabled/page.tsx (1 hunks)
  • apps/web/app/app.dub.co/(dashboard)/[slug]/settings/(basic-layout)/integrations/new/page.tsx (1 hunks)
  • apps/web/app/app.dub.co/(dashboard)/[slug]/settings/oauth-apps/[appId]/page.tsx (1 hunks)
  • apps/web/app/app.dub.co/(dashboard)/[slug]/settings/webhooks/[webhookId]/edit/page.tsx (1 hunks)
  • apps/web/app/app.dub.co/(dashboard)/[slug]/settings/webhooks/[webhookId]/layout.tsx (1 hunks)
  • apps/web/app/app.dub.co/(dashboard)/[slug]/settings/webhooks/[webhookId]/page.tsx (1 hunks)
  • apps/web/app/app.dub.co/(deeplink)/deeplink/[domain]/[key]/page.tsx (1 hunks)
  • apps/web/app/app.dub.co/(onboarding)/[slug]/wrapped/[year]/page.tsx (1 hunks)
  • apps/web/app/app.dub.co/(onboarding)/[slug]/wrapped/page.tsx (1 hunks)
  • apps/web/app/app.dub.co/(redirects)/[slug]/domains/page.tsx (1 hunks)
  • apps/web/app/app.dub.co/(redirects)/[slug]/settings/tags/page.tsx (1 hunks)
  • apps/web/app/app.dub.co/(redirects)/analytics/page.tsx (1 hunks)
  • apps/web/app/app.dub.co/(redirects)/links/[key]/page.tsx (1 hunks)
  • apps/web/app/app.dub.co/(share)/share/[dashboardId]/page.tsx (3 hunks)
  • apps/web/app/cloaked/[url]/page.tsx (2 hunks)
  • apps/web/app/inspect/[domain]/[key]/page.tsx (2 hunks)
  • apps/web/app/password/[linkId]/page.tsx (2 hunks)
  • apps/web/app/proxy/[domain]/[key]/page.tsx (2 hunks)
  • apps/web/app/wellknown/[domain]/[file]/route.ts (1 hunks)
  • apps/web/lib/actions/partners/create-reward.ts (1 hunks)
  • apps/web/lib/actions/partners/online-presence-providers.ts (1 hunks)
  • apps/web/lib/actions/partners/update-reward.ts (1 hunks)
  • apps/web/lib/api/domains/get-email-domain-or-throw.ts (0 hunks)
  • apps/web/lib/api/links/bulk-delete-links.ts (1 hunks)
  • apps/web/lib/api/workflows/render-campaign-email-markdown.ts (1 hunks)
  • apps/web/lib/rewardful/api.ts (1 hunks)
  • apps/web/lib/zod/schemas/program-application-form.ts (6 hunks)
  • apps/web/scripts/testimonial/update-commissions.ts (1 hunks)
  • apps/web/ui/partners/bounties/claim-bounty-modal.tsx (1 hunks)
  • apps/web/ui/partners/groups/design/application-form/fields/max-character-count.tsx (1 hunks)
  • apps/web/ui/partners/groups/design/application-form/fields/website-and-socials-field.tsx (4 hunks)
  • packages/email/src/templates/partner-user-invited.tsx (1 hunks)
  • packages/embeds/react/src/example/app.tsx (1 hunks)
  • packages/ui/src/hooks/use-enter-submit.ts (1 hunks)
💤 Files with no reviewable changes (2)
  • apps/web/lib/api/domains/get-email-domain-or-throw.ts
  • apps/web/app/app.dub.co/(dashboard)/[slug]/(ee)/program/campaigns/campaign-type-icon.tsx
🧰 Additional context used
🧠 Learnings (17)
📚 Learning: 2025-10-15T01:05:43.266Z
Learnt from: steven-tey
Repo: dubinc/dub PR: 2958
File: apps/web/app/app.dub.co/(dashboard)/[slug]/settings/members/page-client.tsx:432-457
Timestamp: 2025-10-15T01:05:43.266Z
Learning: In apps/web/app/app.dub.co/(dashboard)/[slug]/settings/members/page-client.tsx, defer refactoring the custom MenuItem component (lines 432-457) to use the shared dub/ui MenuItem component to a future PR, as requested by steven-tey.

Applied to files:

  • apps/web/app/app.dub.co/(dashboard)/[slug]/settings/oauth-apps/[appId]/page.tsx
  • apps/web/app/(ee)/partners.dub.co/(onboarding)/onboarding/online-presence/page.tsx
  • apps/web/app/app.dub.co/(auth)/auth/reset-password/[token]/page.tsx
  • apps/web/app/app.dub.co/(redirects)/[slug]/domains/page.tsx
  • apps/web/app/app.dub.co/(onboarding)/[slug]/wrapped/page.tsx
  • apps/web/app/app.dub.co/(dashboard)/[slug]/settings/webhooks/[webhookId]/layout.tsx
  • apps/web/app/app.dub.co/(dashboard)/[slug]/settings/(basic-layout)/integrations/[integrationSlug]/manage/page.tsx
  • apps/web/app/app.dub.co/(dashboard)/[slug]/settings/webhooks/[webhookId]/edit/page.tsx
  • apps/web/app/app.dub.co/(dashboard)/[slug]/settings/(basic-layout)/integrations/new/page.tsx
  • apps/web/app/app.dub.co/(dashboard)/[slug]/settings/(basic-layout)/integrations/[integrationSlug]/page.tsx
  • apps/web/app/(ee)/partners.dub.co/(redirects)/apply/[programSlug]/[[...slug]]/page.tsx
  • apps/web/app/app.dub.co/(dashboard)/[slug]/settings/webhooks/[webhookId]/page.tsx
  • apps/web/app/app.dub.co/(dashboard)/[slug]/settings/(basic-layout)/integrations/enabled/page.tsx
  • apps/web/app/app.dub.co/(redirects)/[slug]/settings/tags/page.tsx
  • apps/web/app/cloaked/[url]/page.tsx
  • apps/web/app/app.dub.co/(dashboard)/[slug]/links/folders/[folderId]/members/page.tsx
  • apps/web/app/app.dub.co/(dashboard)/[slug]/(ee)/program/partners/applications/rejected/page.tsx
  • apps/web/app/(ee)/partners.dub.co/(auth)/register/page.tsx
  • apps/web/app/app.dub.co/(share)/share/[dashboardId]/page.tsx
  • apps/web/app/app.dub.co/(deeplink)/deeplink/[domain]/[key]/page.tsx
  • apps/web/app/(ee)/app.dub.co/embed/referrals/page.tsx
  • apps/web/app/app.dub.co/(onboarding)/[slug]/wrapped/[year]/page.tsx
📚 Learning: 2025-09-19T18:46:43.787Z
Learnt from: CR
Repo: dubinc/dub PR: 0
File: packages/hubspot-app/CLAUDE.md:0-0
Timestamp: 2025-09-19T18:46:43.787Z
Learning: Applies to packages/hubspot-app/app/settings/**/*.{js,jsx,ts,tsx} : Do not use React components from hubspot/ui-extensions/crm in settings components

Applied to files:

  • apps/web/app/app.dub.co/(dashboard)/[slug]/settings/oauth-apps/[appId]/page.tsx
📚 Learning: 2025-09-19T18:46:43.787Z
Learnt from: CR
Repo: dubinc/dub PR: 0
File: packages/hubspot-app/CLAUDE.md:0-0
Timestamp: 2025-09-19T18:46:43.787Z
Learning: Applies to packages/hubspot-app/app/settings/**/*.{js,jsx,ts,tsx} : Only use components exported by hubspot/ui-extensions in settings components

Applied to files:

  • apps/web/app/app.dub.co/(dashboard)/[slug]/settings/oauth-apps/[appId]/page.tsx
📚 Learning: 2025-09-19T18:46:43.788Z
Learnt from: CR
Repo: dubinc/dub PR: 0
File: packages/hubspot-app/CLAUDE.md:0-0
Timestamp: 2025-09-19T18:46:43.788Z
Learning: Applies to packages/hubspot-app/app/**/*.{js,jsx,ts,tsx} : When using hubspot/ui-extensions components, only pass the component’s documented props; style props are not valid

Applied to files:

  • apps/web/ui/partners/groups/design/application-form/fields/max-character-count.tsx
📚 Learning: 2025-06-06T07:59:03.120Z
Learnt from: devkiran
Repo: dubinc/dub PR: 2177
File: apps/web/lib/api/links/bulk-create-links.ts:66-84
Timestamp: 2025-06-06T07:59:03.120Z
Learning: In apps/web/lib/api/links/bulk-create-links.ts, the team accepts the risk of potential undefined results from links.find() operations when building invalidLinks arrays, because existing links are fetched from the database based on the input links, so matches are expected to always exist.

Applied to files:

  • apps/web/lib/api/links/bulk-delete-links.ts
  • apps/web/app/api/links/route.ts
  • apps/web/app/(ee)/api/cron/links/[linkId]/complete-tests/route.ts
📚 Learning: 2025-07-30T15:29:54.131Z
Learnt from: TWilson023
Repo: dubinc/dub PR: 2673
File: apps/web/ui/partners/rewards/rewards-logic.tsx:268-275
Timestamp: 2025-07-30T15:29:54.131Z
Learning: In apps/web/ui/partners/rewards/rewards-logic.tsx, when setting the entity field in a reward condition, dependent fields (attribute, operator, value) should be reset rather than preserved because different entities (customer vs sale) have different available attributes. Maintaining existing fields when the entity changes would create invalid state combinations and confusing UX.

Applied to files:

  • apps/web/app/(ee)/partners.dub.co/(onboarding)/onboarding/online-presence/page.tsx
  • apps/web/ui/partners/bounties/claim-bounty-modal.tsx
  • apps/web/lib/actions/partners/create-reward.ts
  • apps/web/lib/actions/partners/update-reward.ts
📚 Learning: 2025-08-18T02:31:22.282Z
Learnt from: steven-tey
Repo: dubinc/dub PR: 2756
File: apps/web/ui/webhooks/webhook-header.tsx:20-20
Timestamp: 2025-08-18T02:31:22.282Z
Learning: The Next.js redirect() function can be used in both Server Components and Client Components, as well as Route Handlers and Server Actions. It is not server-only as previously thought.

Applied to files:

  • apps/web/app/app.dub.co/(redirects)/[slug]/domains/page.tsx
  • apps/web/app/app.dub.co/(onboarding)/[slug]/wrapped/page.tsx
  • apps/web/app/(ee)/partners.dub.co/(redirects)/apply/[programSlug]/[[...slug]]/page.tsx
  • apps/web/app/app.dub.co/(redirects)/[slug]/settings/tags/page.tsx
  • apps/web/app/(ee)/partners.dub.co/(auth)/register/page.tsx
  • apps/web/app/app.dub.co/(onboarding)/[slug]/wrapped/[year]/page.tsx
📚 Learning: 2025-08-18T02:31:22.282Z
Learnt from: steven-tey
Repo: dubinc/dub PR: 2756
File: apps/web/ui/webhooks/webhook-header.tsx:20-20
Timestamp: 2025-08-18T02:31:22.282Z
Learning: The Next.js redirect() function can be used in both Server Components and Client Components, as well as Route Handlers and Server Actions, according to the official Next.js documentation. It is not server-only.

Applied to files:

  • apps/web/app/app.dub.co/(redirects)/[slug]/domains/page.tsx
  • apps/web/app/app.dub.co/(onboarding)/[slug]/wrapped/page.tsx
  • apps/web/app/(ee)/partners.dub.co/(redirects)/apply/[programSlug]/[[...slug]]/page.tsx
  • apps/web/app/app.dub.co/(redirects)/[slug]/settings/tags/page.tsx
  • apps/web/app/(ee)/partners.dub.co/(auth)/register/page.tsx
  • apps/web/app/app.dub.co/(onboarding)/[slug]/wrapped/[year]/page.tsx
📚 Learning: 2025-08-26T15:05:55.081Z
Learnt from: TWilson023
Repo: dubinc/dub PR: 2736
File: apps/web/lib/swr/use-bounty.ts:11-16
Timestamp: 2025-08-26T15:05:55.081Z
Learning: In the Dub codebase, workspace authentication and route structures prevent endless loading states when workspaceId or similar route parameters are missing, so gating SWR loading states on parameter availability is often unnecessary.

Applied to files:

  • apps/web/app/app.dub.co/(redirects)/[slug]/domains/page.tsx
  • apps/web/app/app.dub.co/(redirects)/links/[key]/page.tsx
📚 Learning: 2025-10-17T08:18:19.278Z
Learnt from: devkiran
Repo: dubinc/dub PR: 0
File: :0-0
Timestamp: 2025-10-17T08:18:19.278Z
Learning: In the apps/web codebase, `@/lib/zod` should only be used for places that need OpenAPI extended zod schema. All other places should import from the standard `zod` package directly using `import { z } from "zod"`.

Applied to files:

  • apps/web/ui/partners/groups/design/application-form/fields/website-and-socials-field.tsx
📚 Learning: 2025-09-12T17:31:10.548Z
Learnt from: devkiran
Repo: dubinc/dub PR: 2833
File: apps/web/lib/actions/partners/approve-bounty-submission.ts:53-61
Timestamp: 2025-09-12T17:31:10.548Z
Learning: In approve-bounty-submission.ts, the logic `bounty.rewardAmount ?? rewardAmount` is intentional. Bounties with preset reward amounts should use those fixed amounts, and the rewardAmount override parameter is only used when bounty.rewardAmount is null/undefined (for custom reward bounties). This follows the design pattern where bounties are either "flat rate" (fixed amount) or "custom" (variable amount set during approval).

Applied to files:

  • apps/web/ui/partners/bounties/claim-bounty-modal.tsx
📚 Learning: 2025-08-14T05:17:51.825Z
Learnt from: devkiran
Repo: dubinc/dub PR: 2735
File: apps/web/lib/actions/partners/delete-reward.ts:33-41
Timestamp: 2025-08-14T05:17:51.825Z
Learning: In the partner groups system, a rewardId can only belong to one group, establishing a one-to-one relationship between rewards and groups. This means using Prisma's `update` method (rather than `updateMany`) is appropriate when updating groups by rewardId.

Applied to files:

  • apps/web/lib/actions/partners/create-reward.ts
  • apps/web/app/(ee)/app.dub.co/embed/referrals/utils.ts
  • apps/web/lib/actions/partners/update-reward.ts
📚 Learning: 2025-07-30T15:25:13.936Z
Learnt from: TWilson023
Repo: dubinc/dub PR: 2673
File: apps/web/ui/partners/rewards/add-edit-reward-sheet.tsx:56-66
Timestamp: 2025-07-30T15:25:13.936Z
Learning: In apps/web/ui/partners/rewards/add-edit-reward-sheet.tsx, the form schema uses partial condition objects to allow users to add empty/unconfigured condition fields without type errors, while submission validation uses strict schemas to ensure data integrity. This two-stage validation pattern improves UX by allowing progressive completion of complex forms.

Applied to files:

  • apps/web/lib/zod/schemas/program-application-form.ts
📚 Learning: 2025-07-17T06:41:45.620Z
Learnt from: devkiran
Repo: dubinc/dub PR: 2637
File: apps/web/app/(ee)/api/singular/webhook/route.ts:0-0
Timestamp: 2025-07-17T06:41:45.620Z
Learning: In the Singular integration (apps/web/app/(ee)/api/singular/webhook/route.ts), the event names in the singularToDubEvent object have intentionally different casing: "Copy GAID" and "copy IDFA". This casing difference is valid and should not be changed, as these are the correct event names expected from Singular.

Applied to files:

  • apps/web/app/app.dub.co/(dashboard)/[slug]/settings/webhooks/[webhookId]/page.tsx
📚 Learning: 2025-06-16T19:21:23.506Z
Learnt from: TWilson023
Repo: dubinc/dub PR: 2519
File: apps/web/ui/analytics/utils.ts:35-37
Timestamp: 2025-06-16T19:21:23.506Z
Learning: In the `useAnalyticsFilterOption` function in `apps/web/ui/analytics/utils.ts`, the pattern `options?.context ?? useContext(AnalyticsContext)` is intentionally designed as a complete replacement strategy, not a merge. When `options.context` is provided, it should contain all required fields (`baseApiPath`, `queryString`, `selectedTab`, `requiresUpgrade`) and completely replace the React context, not be merged with it. This is used for dependency injection or testing scenarios.

Applied to files:

  • apps/web/app/app.dub.co/(redirects)/analytics/page.tsx
📚 Learning: 2025-09-18T16:33:17.719Z
Learnt from: TWilson023
Repo: dubinc/dub PR: 2858
File: apps/web/ui/partners/partner-application-tabs.tsx:1-1
Timestamp: 2025-09-18T16:33:17.719Z
Learning: When a React component in Next.js App Router uses non-serializable props (like setState functions), adding "use client" directive can cause serialization warnings. If the component is only imported by Client Components, it's better to omit the "use client" directive to avoid these warnings while still getting client-side execution through promotion.

Applied to files:

  • apps/web/app/(ee)/partners.dub.co/(auth)/register/page.tsx
  • apps/web/app/app.dub.co/(onboarding)/[slug]/wrapped/[year]/page.tsx
📚 Learning: 2025-08-25T21:03:24.285Z
Learnt from: TWilson023
Repo: dubinc/dub PR: 2736
File: apps/web/app/app.dub.co/(dashboard)/[slug]/(ee)/program/bounties/bounty-card.tsx:1-1
Timestamp: 2025-08-25T21:03:24.285Z
Learning: In Next.js App Router, Server Components that use hooks can work without "use client" directive if they are only imported by Client Components, as they get "promoted" to run on the client side within the Client Component boundary.

Applied to files:

  • apps/web/app/(ee)/partners.dub.co/(auth)/register/page.tsx
  • apps/web/app/app.dub.co/(onboarding)/[slug]/wrapped/[year]/page.tsx
🧬 Code graph analysis (10)
apps/web/lib/api/links/bulk-delete-links.ts (1)
apps/web/lib/storage.ts (1)
  • storage (251-251)
apps/web/ui/partners/groups/design/application-form/fields/website-and-socials-field.tsx (2)
apps/web/lib/zod/schemas/program-application-form.ts (1)
  • programApplicationFormSiteSchema (90-100)
apps/web/ui/partners/groups/design/application-form/fields/form-control.tsx (1)
  • FormControl (19-51)
apps/web/ui/partners/bounties/claim-bounty-modal.tsx (1)
apps/web/lib/zod/schemas/bounties.ts (1)
  • MAX_BOUNTY_SUBMISSION_DESCRIPTION_LENGTH (23-23)
apps/web/app/(ee)/api/mock/rewardful/campaigns/[campaignId]/route.ts (2)
apps/web/app/api/og/avatar/[[...seed]]/route.tsx (1)
  • GET (7-73)
apps/web/app/wellknown/[domain]/[file]/route.ts (1)
  • GET (11-53)
apps/web/lib/api/workflows/render-campaign-email-markdown.ts (1)
apps/web/lib/api/workflows/interpolate-email-template.ts (1)
  • interpolateEmailTemplate (23-37)
apps/web/app/inspect/[domain]/[key]/page.tsx (2)
apps/web/app/[domain]/page.tsx (1)
  • generateMetadata (6-21)
apps/web/app/proxy/[domain]/[key]/page.tsx (1)
  • generateMetadata (13-36)
apps/web/app/cloaked/[url]/page.tsx (2)
apps/web/app/[domain]/page.tsx (1)
  • generateMetadata (6-21)
apps/web/app/proxy/[domain]/[key]/page.tsx (1)
  • generateMetadata (13-36)
apps/web/app/password/[linkId]/page.tsx (1)
apps/web/app/[domain]/page.tsx (1)
  • generateMetadata (6-21)
apps/web/app/[domain]/page.tsx (5)
apps/web/app/app.dub.co/(share)/share/[dashboardId]/page.tsx (1)
  • generateMetadata (12-28)
apps/web/app/cloaked/[url]/page.tsx (1)
  • generateMetadata (11-28)
apps/web/app/inspect/[domain]/[key]/page.tsx (1)
  • generateMetadata (22-44)
apps/web/app/password/[linkId]/page.tsx (1)
  • generateMetadata (19-56)
apps/web/app/proxy/[domain]/[key]/page.tsx (1)
  • generateMetadata (13-36)
apps/web/app/app.dub.co/(share)/share/[dashboardId]/page.tsx (2)
apps/web/app/[domain]/page.tsx (1)
  • generateMetadata (6-21)
apps/web/app/password/[linkId]/page.tsx (1)
  • generateMetadata (19-56)
🔇 Additional comments (61)
apps/web/lib/actions/partners/online-presence-providers.ts (1)

132-132: Formatting fix approved.

The trailing newline adjustment ensures proper EOF formatting per Prettier standards. No functional or structural changes to the code.

apps/web/ui/partners/bounties/claim-bounty-modal.tsx (1)

590-593: LGTM!

The conditional reformatting maintains identical logic—it still correctly enforces the maximum description length by checking value.length <= MAX_BOUNTY_SUBMISSION_DESCRIPTION_LENGTH before updating state. The multi-line formatting is consistent with Prettier standards.

apps/web/app/app.dub.co/(auth)/auth/reset-password/[token]/page.tsx (1)

16-16: Clean formatting that aligns with Next.js 15 async params pattern.

The single-line destructuring of token improves readability while maintaining correctness with the Next.js 15 async params API (properly awaited on line 14).

packages/embeds/react/src/example/app.tsx (1)

2-2: Clean import consolidation - unused ReactDom removed.

The consolidation correctly removes the unused ReactDom default import from "react-dom" while retaining the necessary createRoot import from "react-dom/client". All imports are used appropriately: hooks from React, createRoot on line 21, and DubEmbed on line 18.

apps/web/lib/api/links/bulk-delete-links.ts (1)

23-25: Prettier formatting aligns with codebase standards.

The multiline expansion of the .map() call with trailing comma improves readability while preserving the logic. The non-null assertion on link.image! is safe since the preceding .filter() ensures the image property is truthy. All operations within Promise.all() correctly execute in parallel.

packages/email/src/templates/partner-user-invited.tsx (1)

57-58: LGTM! Formatting improvement.

The inline formatting of the invitation message now matches the pattern used in the conditional branch above (lines 45-53), improving consistency across the template.

apps/web/lib/api/workflows/render-campaign-email-markdown.ts (1)

50-52: LGTM! Formatting standardization is appropriate.

The reformatting of the interpolateEmailTemplate call aligns with the PR's Prettier standardization objectives. No logic changes detected.

apps/web/ui/partners/groups/design/application-form/fields/max-character-count.tsx (1)

3-16: Prop typing and className cleanup look solid.

Destructuring the props with inline typing and keeping the cn call tidy improves readability without altering behavior. No further action needed.

apps/web/app/(ee)/partners.dub.co/(auth)/register/page.tsx (1)

7-12: LGTM! Formatting improved and Next.js 15 async params handled correctly.

The function signature has been reformatted to a single-line parameter declaration, consistent with the prettier standardization goal of this PR. The async params pattern (awaiting props.params before destructuring) is correctly implemented for Next.js 15.

apps/web/ui/partners/groups/design/application-form/fields/website-and-socials-field.tsx (2)

51-62: LGTM! Good UX enhancement for website field.

The new onPasteWebsite handler mirrors the existing onPasteSocial pattern and improves user experience by automatically sanitizing pasted website URLs. The implementation is correct: properly memoized, extracts clipboard text, applies sanitizeWebsite, and updates the form value.

Also applies to: 77-77


1-229: Formatting changes align with PR objective.

The remaining changes are Prettier formatting adjustments: import reorganization, type alias reformatting, className string layout, and consistent JSX prop formatting. All formatting changes maintain the original logic without functional impact.

apps/web/app/api/links/route.ts (1)

4-4: LGTM! Import reordering for prettier formatting.

This import reordering is purely cosmetic and has no functional impact. The change aligns with the PR's objective to standardize formatting across the codebase.

apps/web/app/(ee)/partners.dub.co/(onboarding)/onboarding/online-presence/page.tsx (1)

86-103: LGTM! Formatting improves readability.

The conditional spread expressions have been reformatted to multi-line format, making each condition more visible and easier to review. No behavioral changes.

apps/web/app/app.dub.co/(dashboard)/[slug]/settings/(basic-layout)/integrations/[integrationSlug]/manage/page.tsx (1)

9-11: LGTM! Consistent formatting.

Function signature reformatted to single-line inline parameter declaration. No behavioral changes.

apps/web/app/app.dub.co/(onboarding)/[slug]/wrapped/page.tsx (1)

3-5: LGTM! Consistent formatting.

Function signature reformatted to single-line inline parameter declaration. No behavioral changes.

apps/web/app/[domain]/not-found/page.tsx (1)

24-26: LGTM! Consistent formatting.

Function signature reformatted to single-line inline parameter declaration. No behavioral changes.

apps/web/lib/rewardful/api.ts (1)

6-6: LGTM! Import ordering standardized.

Import reordered within the block for consistency. No functional changes.

apps/web/scripts/testimonial/update-commissions.ts (1)

2-2: LGTM! Import ordering standardized.

Import reordered for consistency. No functional changes.

apps/web/app/(ee)/partners.dub.co/(auth)/auth/reset-password/[token]/page.tsx (1)

15-15: LGTM! Consistent destructuring format.

Token destructuring reformatted to single-line. No behavioral changes.

apps/web/app/cloaked/[url]/page.tsx (2)

11-13: LGTM! Consistent formatting.

Function signature reformatted to single-line inline parameter declaration. No behavioral changes.


30-32: LGTM! Consistent formatting.

Function signature reformatted to single-line inline parameter declaration. No behavioral changes.

packages/ui/src/hooks/use-enter-submit.ts (1)

3-5: LGTM! Formatting improved.

The function signature has been reformatted to multi-line format with proper indentation and trailing comma, consistent with Prettier standards.

apps/web/app/password/[linkId]/page.tsx (2)

19-21: LGTM! Formatting improved.

The generateMetadata function signature has been reformatted to multi-line format, consistent with Prettier standards and the broader PR pattern.


58-60: LGTM! Formatting improved.

The page component signature has been reformatted to multi-line format, maintaining consistency with the formatting pattern applied throughout this PR.

apps/web/app/(ee)/api/cron/links/[linkId]/complete-tests/route.ts (1)

12-16: LGTM! Formatting improved.

The trailing comma addition and inline destructuring formatting align with Prettier standards, maintaining code consistency.

apps/web/app/(ee)/api/mock/rewardful/campaigns/[campaignId]/route.ts (1)

4-7: LGTM! Formatting improved.

The route handler signature has been reformatted to multi-line format with trailing comma, consistent with Prettier standards and the pattern applied throughout this PR.

apps/web/app/app.dub.co/(dashboard)/[slug]/settings/(basic-layout)/integrations/enabled/page.tsx (1)

15-17: LGTM! Formatting improved.

The page component signature has been reformatted to multi-line format, aligning with the consistent formatting pattern applied throughout this PR.

apps/web/app/app.dub.co/(dashboard)/[slug]/(ee)/program/partners/applications/rejected/page.tsx (1)

5-7: LGTM! Formatting improved.

The page component signature has been reformatted to multi-line format, maintaining consistency with the formatting standardization applied across the codebase.

apps/web/app/app.dub.co/(dashboard)/[slug]/settings/webhooks/[webhookId]/layout.tsx (1)

4-10: LGTM! Formatting improved.

The layout component signature and destructuring have been reformatted for better readability, with the multi-line signature and separate destructuring line following Prettier conventions.

apps/web/app/[domain]/page.tsx (1)

6-8: LGTM! Formatting improved.

The generateMetadata function signature has been reformatted to multi-line format, consistent with Prettier standards and the formatting pattern applied throughout this PR.

apps/web/app/proxy/[domain]/[key]/page.tsx (1)

13-15: LGTM! Formatting standardization applied.

The function signatures have been reformatted for consistency. No behavioral changes.

Also applies to: 38-40

apps/web/app/app.dub.co/(redirects)/links/[key]/page.tsx (1)

4-8: LGTM! Formatting standardization applied.

The function signature has been reformatted for consistency. No behavioral changes.

apps/web/app/app.dub.co/(dashboard)/[slug]/settings/webhooks/[webhookId]/page.tsx (1)

3-5: LGTM! Formatting standardization applied.

The function signature has been reformatted for consistency. No behavioral changes.

apps/web/app/api/og/avatar/[[...seed]]/route.tsx (1)

7-10: LGTM! Formatting standardization applied.

The function signature has been reformatted with a trailing comma for consistency. No behavioral changes.

apps/web/app/[domain]/stats/[key]/page.tsx (1)

7-9: LGTM! Formatting standardization applied.

The function signature has been reformatted for consistency. No behavioral changes.

apps/web/app/wellknown/[domain]/[file]/route.ts (1)

13-13: LGTM! Formatting standardization applied.

Trailing comma added for consistency. No behavioral changes.

apps/web/app/app.dub.co/(dashboard)/[slug]/links/folders/[folderId]/members/page.tsx (1)

5-7: LGTM! Formatting standardization applied.

The function signature has been reformatted for consistency. No behavioral changes.

apps/web/app/app.dub.co/(dashboard)/[slug]/settings/oauth-apps/[appId]/page.tsx (1)

3-5: LGTM! Formatting standardization applied.

The function signature has been reformatted for consistency. No behavioral changes.

apps/web/app/(ee)/partners.dub.co/(redirects)/apply/[programSlug]/[[...slug]]/page.tsx (1)

3-5: Formatting-only change confirmed.

Signature is unchanged semantically; async param handling stays intact.

apps/web/app/app.dub.co/(deeplink)/deeplink/[domain]/[key]/page.tsx (1)

11-13: Formatting-only change confirmed.

Inline props signature keeps the same param contract; logic unaffected.

apps/web/app/app.dub.co/(redirects)/analytics/page.tsx (1)

4-6: Formatting-only change confirmed.

Parameter typing and redirect flow remain exactly the same.

apps/web/app/app.dub.co/(dashboard)/[slug]/settings/webhooks/[webhookId]/edit/page.tsx (1)

3-5: Formatting-only change confirmed.

Webhook ID handling is untouched; this is just signature compaction.

apps/web/app/(ee)/app.dub.co/embed/referrals/page.tsx (1)

9-15: Formatting-only change confirmed.

Props contract and downstream usage remain identical.

apps/web/app/app.dub.co/(onboarding)/[slug]/wrapped/[year]/page.tsx (1)

6-8: LGTM – Formatting-only change.

Function signature reformatted to single-line inline parameter declaration. No behavioral changes.

apps/web/app/app.dub.co/(dashboard)/[slug]/settings/(basic-layout)/integrations/new/page.tsx (1)

6-8: LGTM – Formatting-only change.

Function signature reformatted to single-line inline parameter declaration. No behavioral changes.

apps/web/app/app.dub.co/(redirects)/[slug]/settings/tags/page.tsx (1)

3-7: LGTM – Formatting-only change.

Function signature reformatted to single-line inline parameter declaration. No behavioral changes.

apps/web/app/app.dub.co/(redirects)/[slug]/domains/page.tsx (1)

3-7: LGTM – Formatting-only change.

Function signature reformatted to single-line inline parameter declaration. No behavioral changes.

apps/web/app/inspect/[domain]/[key]/page.tsx (2)

22-24: LGTM – Formatting-only change.

Function signature reformatted to single-line inline parameter declaration. No behavioral changes.


46-48: LGTM – Formatting-only change.

Function signature reformatted to single-line inline parameter declaration. No behavioral changes.

apps/web/app/app.dub.co/(dashboard)/[slug]/settings/(basic-layout)/integrations/[integrationSlug]/page.tsx (1)

8-10: LGTM – Formatting-only change.

Function signature reformatted to single-line inline parameter declaration. No behavioral changes.

apps/web/app/app.dub.co/(share)/share/[dashboardId]/page.tsx (4)

12-14: LGTM – Formatting-only change.

Function signature reformatted to single-line inline parameter declaration. No behavioral changes.


30-32: LGTM – Formatting-only change.

Function signature reformatted to single-line inline parameter declaration. No behavioral changes.


38-38: Good improvement: explicit 404 handling.

Changed from silent early return to explicit notFound() call, which properly renders a 404 page when the dashboard link is missing. This is clearer and more user-friendly than the previous behavior.


43-44: LGTM – Formatting-only change.

Password check logic reformatted across multiple lines. No behavioral changes.

apps/web/lib/actions/partners/update-reward.ts (2)

103-103: Serialization added to audit log metadata.

Now serializing reward metadata before recording in the audit log. This ensures consistent data formatting in audit records.


5-5: Verified: Serialization pattern is consistent with existing reward operations.

The serializeReward addition is intentional and follows the established pattern in create-reward.ts, which already serializes reward metadata identically. Both create and update reward audit logs now consistently serialize the metadata to convert Prisma Decimal objects to numbers before logging, ensuring consistency across reward-related audit trails.

apps/web/app/(ee)/app.dub.co/embed/referrals/utils.ts (1)

1-1: LGTM! Import organization improvement.

The serializeReward import has been moved to the top of the file as part of the prettier formatting standardization. This improves code organization without any functional changes.

apps/web/lib/actions/partners/create-reward.ts (1)

6-6: LGTM! Import organization improvement.

The serializeReward import has been repositioned earlier in the imports list, consistent with the prettier formatting standardization applied across the codebase in this PR.

apps/web/lib/zod/schemas/program-application-form.ts (3)

20-23: Solid implementation of WithValue schema variants.

The addition of WithValue schema variants across all field types creates a clean two-stage validation pattern: base schemas for form definitions, WithValue variants for completed form responses. This aligns with best practices for separating structure from data and matches the pattern documented in your learnings around form submission validation.

Also applies to: 35-38, 59-62, 84-87, 102-105


78-81: Discriminated union refactor is sound.

The change from inline array to explicit discriminated union improves clarity. The discriminator field "multiple" correctly matches the literal fields in both union members (programApplicationFormMultipleChoiceData and programApplicationFormSingleChoiceData).


129-138: New discriminated union and array schemas properly structured.

The new programApplicationFormFieldWithValuesSchema correctly references all WithValue variants, and the array schemas follow the same pattern for both base and value-inclusive fields. The programApplicationFormDataSchema cleanly extends the base schema while overriding only the fields property to use the WithValue variants—avoiding duplication.

Also applies to: 140-146, 156-159

Copy link
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

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 22d6684 and f2bc3ca.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (3)
  • apps/web/package.json (0 hunks)
  • package.json (1 hunks)
  • packages/stripe-app/package.json (0 hunks)
💤 Files with no reviewable changes (2)
  • apps/web/package.json
  • packages/stripe-app/package.json
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: Socket Security: Pull Request Alerts

@steven-tey
Copy link
Collaborator Author

@coderabbitai full review

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Nov 7, 2025

✅ Actions performed

Full review triggered.

@socket-security
Copy link

Review the following changes in direct dependencies. Learn more about Socket for GitHub.

Diff Package Supply Chain
Security
Vulnerability Quality Maintenance License
Updated@​types/​react@​18.2.48 ⏵ 18.3.26100 +110079 +195100

View full report

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