Skip to content

feat: upgrade to Zod v4#104

Merged
coji merged 2 commits intomainfrom
feat/zod-v4-upgrade
Jan 10, 2026
Merged

feat: upgrade to Zod v4#104
coji merged 2 commits intomainfrom
feat/zod-v4-upgrade

Conversation

@coji
Copy link
Owner

@coji coji commented Jan 10, 2026

Summary

  • Upgrade zod from v3.25.64 to v4.3.5
  • Replace zodix with @coji/zodix for Zod v4 support
  • Update imports to use @conform-to/zod/v4 and @coji/zodix/v4
  • Update CLAUDE.md with new import paths

Breaking Changes

  • z.enum() no longer accepts required_error parameter (removed in Zod v4)

Test plan

  • pnpm typecheck passes
  • pnpm build passes
  • pnpm test passes (25 tests)

References

🤖 Generated with Claude Code

Summary by CodeRabbit

  • Chores

    • Updated validation libraries to newer versions including Zod v4, Conform v4, and zodix package updates
  • Changes

    • Simplified validation error messages in integration settings form to use default error handling

✏️ Tip: You can customize this high-level summary in your review settings.

@coderabbitai
Copy link

coderabbitai bot commented Jan 10, 2026

Warning

Rate limit exceeded

@coji has exceeded the limit for the number of commits that can be reviewed per hour. Please wait 12 minutes and 28 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 bec75a3 and 62711d9.

📒 Files selected for processing (1)
  • app/routes/admin+/$organization.settings/types.ts
📝 Walkthrough

Walkthrough

This PR upgrades dependencies and import paths across the codebase: replaces zodix with @coji/zodix/v4, updates @conform-to/zod to @conform-to/zod/v4, and bumps zod from v3 to v4. Additionally, custom required_error messages are removed from enum fields in the integration settings schema.

Changes

Cohort / File(s) Summary
Dashboard Routes
app/routes/_dashboard+/$organization._index/route.tsx, app/routes/_dashboard+/$organization.ongoing/route.tsx, app/routes/_dashboard+/$organization/route.tsx
Updated zodix import path from 'zodix' to '@coji/zodix/v4'
Admin Core Routes
app/routes/admin+/$organization._layout/route.tsx, app/routes/admin+/$organization.members/route.tsx, app/routes/admin+/$organization.repositories/$repository.$pull/route.tsx, app/routes/admin+/$organization.repositories/$repository._index/route.tsx, app/routes/admin+/$organization.repositories/$repository.delete/route.tsx, app/routes/admin+/$organization.repositories._index/route.tsx, app/routes/admin+/$organization.repositories.tsx, app/routes/admin+/$organization.settings/route.tsx
Updated zodix import path from 'zodix' to '@coji/zodix/v4'
Admin Repository Configuration
app/routes/admin+/$organization.repositories.add/route.tsx, app/routes/admin+/$organization.repositories.$repository.settings/route.tsx
Updated both zx import from 'zodix' to '@coji/zodix/v4' and parseWithZod from '@conform-to/zod' to '@conform-to/zod/v4'
Admin Settings Forms
app/routes/admin+/$organization.settings/forms/delete-organization.action.server.ts, app/routes/admin+/$organization.settings/forms/delete-organization.tsx, app/routes/admin+/$organization.settings/forms/export-settings.action.server.ts, app/routes/admin+/$organization.settings/forms/export-settings.tsx, app/routes/admin+/$organization.settings/forms/integration-settings.action.server.ts, app/routes/admin+/$organization.settings/forms/integration-settings.tsx, app/routes/admin+/$organization.settings/forms/organization-settings.action.server.ts, app/routes/admin+/$organization.settings/forms/organization-settings.tsx
Updated parseWithZod import from '@conform-to/zod' to '@conform-to/zod/v4'
Admin Create Route
app/routes/admin+/create/route.tsx
Updated parseWithZod import from '@conform-to/zod' to '@conform-to/zod/v4'
Settings Schema
app/routes/admin+/$organization.settings/types.ts
Removed custom required_error messages from provider and method enum fields in integrationSettingsSchema
Package Dependencies
package.json
Added @coji/zodix: "0.7.0", removed zodix: "0.4.4", and upgraded zod from "3.25.64" to "4.3.5"
Documentation
CLAUDE.md
Updated code example imports to reflect Conform-to/Zod v4 and zodix v4 equivalents

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~20 minutes

Possibly related PRs

Poem

🐰 Dependencies dance in v4's embrace,
Zodix and Conform now join the race,
Enums stripped clean of custom cries,
A cleaner schema beneath the skies,
Hop along, code hops with grace! ✨

🚥 Pre-merge checks | ✅ 3
✅ 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 'feat: upgrade to Zod v4' accurately reflects the main change in the pull request, which is upgrading Zod from v3 to v4 across the entire codebase.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

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


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.

- Upgrade zod from v3.25.64 to v4.3.5
- Replace zodix with @coji/zodix for Zod v4 support
- Update imports to use @conform-to/zod/v4 and @coji/zodix/v4
- Update CLAUDE.md with new import paths
- Remove deprecated required_error parameter from z.enum()

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
@coji coji force-pushed the feat/zod-v4-upgrade branch from 80cb614 to bec75a3 Compare January 10, 2026 11:46
Copy link

@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: 0

🧹 Nitpick comments (1)
app/routes/admin+/$organization.settings/types.ts (1)

16-17: LGTM! Correct removal of deprecated parameter.

The required_error parameter has been removed as it's deprecated in Zod v4. Error messages will now use Zod's default validation messages for enum fields.

If custom error messages are desired, you can migrate to Zod v4's unified error parameter:

♻️ Optional: Add custom error messages using v4 syntax
 export const integrationSettingsSchema = z.object({
   id: z.string().optional(),
-  provider: z.enum(['github']),
-  method: z.enum(['token']),
+  provider: z.enum(['github'], {
+    error: (issue) => {
+      if (issue.code === 'invalid_enum_value' || issue.code === 'invalid_type') {
+        return 'provider is required';
+      }
+    },
+  }),
+  method: z.enum(['token'], {
+    error: (issue) => {
+      if (issue.code === 'invalid_enum_value' || issue.code === 'invalid_type') {
+        return 'method is required';
+      }
+    },
+  }),
   privateToken: z.string().min(1, { message: 'private token is required' }),
 })
📜 Review details

Configuration used: defaults

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 5ecc1fb and bec75a3.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (25)
  • CLAUDE.md
  • app/routes/_dashboard+/$organization._index/route.tsx
  • app/routes/_dashboard+/$organization.ongoing/route.tsx
  • app/routes/_dashboard+/$organization/route.tsx
  • app/routes/admin+/$organization._layout/route.tsx
  • app/routes/admin+/$organization.members/route.tsx
  • app/routes/admin+/$organization.repositories.$repository.$pull/route.tsx
  • app/routes/admin+/$organization.repositories.$repository._index/route.tsx
  • app/routes/admin+/$organization.repositories.$repository.delete/route.tsx
  • app/routes/admin+/$organization.repositories.$repository.settings/route.tsx
  • app/routes/admin+/$organization.repositories._index/route.tsx
  • app/routes/admin+/$organization.repositories.add/route.tsx
  • app/routes/admin+/$organization.repositories.tsx
  • app/routes/admin+/$organization.settings/forms/delete-organization.action.server.ts
  • app/routes/admin+/$organization.settings/forms/delete-organization.tsx
  • app/routes/admin+/$organization.settings/forms/export-settings.action.server.ts
  • app/routes/admin+/$organization.settings/forms/export-settings.tsx
  • app/routes/admin+/$organization.settings/forms/integration-settings.action.server.ts
  • app/routes/admin+/$organization.settings/forms/integration-settings.tsx
  • app/routes/admin+/$organization.settings/forms/organization-settings.action.server.ts
  • app/routes/admin+/$organization.settings/forms/organization-settings.tsx
  • app/routes/admin+/$organization.settings/route.tsx
  • app/routes/admin+/$organization.settings/types.ts
  • app/routes/admin+/create/route.tsx
  • package.json
🧰 Additional context used
📓 Path-based instructions (7)
**/{routes,server,entry}/**/*.{ts,tsx}

📄 CodeRabbit inference engine (CLAUDE.md)

Use React Router v7 in SSR mode with Express server for the web framework

Files:

  • app/routes/_dashboard+/$organization._index/route.tsx
  • app/routes/admin+/$organization.settings/forms/export-settings.tsx
  • app/routes/admin+/create/route.tsx
  • app/routes/admin+/$organization.settings/forms/export-settings.action.server.ts
  • app/routes/admin+/$organization.settings/forms/delete-organization.tsx
  • app/routes/admin+/$organization.settings/forms/integration-settings.tsx
  • app/routes/_dashboard+/$organization.ongoing/route.tsx
  • app/routes/admin+/$organization.settings/forms/delete-organization.action.server.ts
  • app/routes/admin+/$organization.repositories._index/route.tsx
  • app/routes/admin+/$organization._layout/route.tsx
  • app/routes/admin+/$organization.repositories.$repository._index/route.tsx
  • app/routes/admin+/$organization.settings/route.tsx
  • app/routes/admin+/$organization.repositories.$repository.settings/route.tsx
  • app/routes/admin+/$organization.settings/forms/integration-settings.action.server.ts
  • app/routes/admin+/$organization.repositories.$repository.delete/route.tsx
  • app/routes/_dashboard+/$organization/route.tsx
  • app/routes/admin+/$organization.settings/forms/organization-settings.action.server.ts
  • app/routes/admin+/$organization.repositories.add/route.tsx
  • app/routes/admin+/$organization.repositories.tsx
  • app/routes/admin+/$organization.settings/types.ts
  • app/routes/admin+/$organization.settings/forms/organization-settings.tsx
  • app/routes/admin+/$organization.repositories.$repository.$pull/route.tsx
  • app/routes/admin+/$organization.members/route.tsx
app/routes/**/*.{ts,tsx}

📄 CodeRabbit inference engine (CLAUDE.md)

app/routes/**/*.{ts,tsx}: Use file-based routing with remix-flat-routes convention using the + folder syntax for organizing routes
Use intent-based form action dispatch with ts-pattern for routes with multiple form actions

Files:

  • app/routes/_dashboard+/$organization._index/route.tsx
  • app/routes/admin+/$organization.settings/forms/export-settings.tsx
  • app/routes/admin+/create/route.tsx
  • app/routes/admin+/$organization.settings/forms/export-settings.action.server.ts
  • app/routes/admin+/$organization.settings/forms/delete-organization.tsx
  • app/routes/admin+/$organization.settings/forms/integration-settings.tsx
  • app/routes/_dashboard+/$organization.ongoing/route.tsx
  • app/routes/admin+/$organization.settings/forms/delete-organization.action.server.ts
  • app/routes/admin+/$organization.repositories._index/route.tsx
  • app/routes/admin+/$organization._layout/route.tsx
  • app/routes/admin+/$organization.repositories.$repository._index/route.tsx
  • app/routes/admin+/$organization.settings/route.tsx
  • app/routes/admin+/$organization.repositories.$repository.settings/route.tsx
  • app/routes/admin+/$organization.settings/forms/integration-settings.action.server.ts
  • app/routes/admin+/$organization.repositories.$repository.delete/route.tsx
  • app/routes/_dashboard+/$organization/route.tsx
  • app/routes/admin+/$organization.settings/forms/organization-settings.action.server.ts
  • app/routes/admin+/$organization.repositories.add/route.tsx
  • app/routes/admin+/$organization.repositories.tsx
  • app/routes/admin+/$organization.settings/types.ts
  • app/routes/admin+/$organization.settings/forms/organization-settings.tsx
  • app/routes/admin+/$organization.repositories.$repository.$pull/route.tsx
  • app/routes/admin+/$organization.members/route.tsx
**/*.{ts,tsx}

📄 CodeRabbit inference engine (CLAUDE.md)

Use ~/ path alias prefix for imports from the app/ directory

Files:

  • app/routes/_dashboard+/$organization._index/route.tsx
  • app/routes/admin+/$organization.settings/forms/export-settings.tsx
  • app/routes/admin+/create/route.tsx
  • app/routes/admin+/$organization.settings/forms/export-settings.action.server.ts
  • app/routes/admin+/$organization.settings/forms/delete-organization.tsx
  • app/routes/admin+/$organization.settings/forms/integration-settings.tsx
  • app/routes/_dashboard+/$organization.ongoing/route.tsx
  • app/routes/admin+/$organization.settings/forms/delete-organization.action.server.ts
  • app/routes/admin+/$organization.repositories._index/route.tsx
  • app/routes/admin+/$organization._layout/route.tsx
  • app/routes/admin+/$organization.repositories.$repository._index/route.tsx
  • app/routes/admin+/$organization.settings/route.tsx
  • app/routes/admin+/$organization.repositories.$repository.settings/route.tsx
  • app/routes/admin+/$organization.settings/forms/integration-settings.action.server.ts
  • app/routes/admin+/$organization.repositories.$repository.delete/route.tsx
  • app/routes/_dashboard+/$organization/route.tsx
  • app/routes/admin+/$organization.settings/forms/organization-settings.action.server.ts
  • app/routes/admin+/$organization.repositories.add/route.tsx
  • app/routes/admin+/$organization.repositories.tsx
  • app/routes/admin+/$organization.settings/types.ts
  • app/routes/admin+/$organization.settings/forms/organization-settings.tsx
  • app/routes/admin+/$organization.repositories.$repository.$pull/route.tsx
  • app/routes/admin+/$organization.members/route.tsx
**/{routes,services}/**/*.{ts,tsx}

📄 CodeRabbit inference engine (CLAUDE.md)

Use Conform with Zod for type-safe form validation and parsing

Files:

  • app/routes/_dashboard+/$organization._index/route.tsx
  • app/routes/admin+/$organization.settings/forms/export-settings.tsx
  • app/routes/admin+/create/route.tsx
  • app/routes/admin+/$organization.settings/forms/export-settings.action.server.ts
  • app/routes/admin+/$organization.settings/forms/delete-organization.tsx
  • app/routes/admin+/$organization.settings/forms/integration-settings.tsx
  • app/routes/_dashboard+/$organization.ongoing/route.tsx
  • app/routes/admin+/$organization.settings/forms/delete-organization.action.server.ts
  • app/routes/admin+/$organization.repositories._index/route.tsx
  • app/routes/admin+/$organization._layout/route.tsx
  • app/routes/admin+/$organization.repositories.$repository._index/route.tsx
  • app/routes/admin+/$organization.settings/route.tsx
  • app/routes/admin+/$organization.repositories.$repository.settings/route.tsx
  • app/routes/admin+/$organization.settings/forms/integration-settings.action.server.ts
  • app/routes/admin+/$organization.repositories.$repository.delete/route.tsx
  • app/routes/_dashboard+/$organization/route.tsx
  • app/routes/admin+/$organization.settings/forms/organization-settings.action.server.ts
  • app/routes/admin+/$organization.repositories.add/route.tsx
  • app/routes/admin+/$organization.repositories.tsx
  • app/routes/admin+/$organization.settings/types.ts
  • app/routes/admin+/$organization.settings/forms/organization-settings.tsx
  • app/routes/admin+/$organization.repositories.$repository.$pull/route.tsx
  • app/routes/admin+/$organization.members/route.tsx
**/*.server.ts

📄 CodeRabbit inference engine (CLAUDE.md)

**/*.server.ts: Use .server.ts file suffix for server-only code that won't be bundled for the client
Use Kysely query builder for type-safe database operations with types generated from the database schema

Files:

  • app/routes/admin+/$organization.settings/forms/export-settings.action.server.ts
  • app/routes/admin+/$organization.settings/forms/delete-organization.action.server.ts
  • app/routes/admin+/$organization.settings/forms/integration-settings.action.server.ts
  • app/routes/admin+/$organization.settings/forms/organization-settings.action.server.ts
**/*.action.server.ts

📄 CodeRabbit inference engine (CLAUDE.md)

Use .action.server.ts suffix for form action handler files in server-side code

Files:

  • app/routes/admin+/$organization.settings/forms/export-settings.action.server.ts
  • app/routes/admin+/$organization.settings/forms/delete-organization.action.server.ts
  • app/routes/admin+/$organization.settings/forms/integration-settings.action.server.ts
  • app/routes/admin+/$organization.settings/forms/organization-settings.action.server.ts
app/routes/**/$*.tsx

📄 CodeRabbit inference engine (CLAUDE.md)

Use $param syntax for dynamic route segments and $organization.settings/ pattern for nested route folders

Files:

  • app/routes/admin+/$organization.repositories.tsx
🧠 Learnings (9)
📓 Common learnings
Learnt from: CR
Repo: coji/upflow PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-10T09:39:54.188Z
Learning: Applies to **/{routes,services}/**/*.{ts,tsx} : Use Conform with Zod for type-safe form validation and parsing
📚 Learning: 2026-01-10T09:39:54.188Z
Learnt from: CR
Repo: coji/upflow PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-10T09:39:54.188Z
Learning: Applies to app/routes/**/$*.tsx : Use `$param` syntax for dynamic route segments and `$organization.settings/` pattern for nested route folders

Applied to files:

  • app/routes/_dashboard+/$organization._index/route.tsx
  • app/routes/admin+/$organization.settings/forms/export-settings.tsx
  • app/routes/admin+/create/route.tsx
  • app/routes/admin+/$organization.settings/forms/export-settings.action.server.ts
  • app/routes/admin+/$organization.settings/forms/delete-organization.tsx
  • app/routes/admin+/$organization.settings/forms/integration-settings.tsx
  • app/routes/_dashboard+/$organization.ongoing/route.tsx
  • app/routes/admin+/$organization.settings/forms/delete-organization.action.server.ts
  • app/routes/admin+/$organization.repositories._index/route.tsx
  • app/routes/admin+/$organization._layout/route.tsx
  • app/routes/admin+/$organization.repositories.$repository._index/route.tsx
  • app/routes/admin+/$organization.settings/route.tsx
  • app/routes/admin+/$organization.repositories.$repository.settings/route.tsx
  • app/routes/admin+/$organization.settings/forms/integration-settings.action.server.ts
  • app/routes/admin+/$organization.repositories.$repository.delete/route.tsx
  • app/routes/_dashboard+/$organization/route.tsx
  • app/routes/admin+/$organization.settings/forms/organization-settings.action.server.ts
  • app/routes/admin+/$organization.repositories.add/route.tsx
  • app/routes/admin+/$organization.repositories.tsx
  • CLAUDE.md
  • app/routes/admin+/$organization.settings/forms/organization-settings.tsx
  • app/routes/admin+/$organization.repositories.$repository.$pull/route.tsx
  • app/routes/admin+/$organization.members/route.tsx
📚 Learning: 2026-01-10T09:39:54.188Z
Learnt from: CR
Repo: coji/upflow PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-10T09:39:54.188Z
Learning: Applies to app/routes/**/_*.tsx : Use `_layout.tsx` for layout routes without URL segments and `_index.tsx` for index routes in remix-flat-routes convention

Applied to files:

  • app/routes/_dashboard+/$organization._index/route.tsx
  • app/routes/admin+/create/route.tsx
  • app/routes/_dashboard+/$organization.ongoing/route.tsx
  • app/routes/admin+/$organization.repositories._index/route.tsx
  • app/routes/admin+/$organization._layout/route.tsx
  • app/routes/admin+/$organization.repositories.$repository._index/route.tsx
  • app/routes/admin+/$organization.settings/route.tsx
  • app/routes/_dashboard+/$organization/route.tsx
  • app/routes/admin+/$organization.settings/forms/organization-settings.action.server.ts
  • app/routes/admin+/$organization.repositories.add/route.tsx
  • app/routes/admin+/$organization.members/route.tsx
📚 Learning: 2026-01-10T09:39:54.188Z
Learnt from: CR
Repo: coji/upflow PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-10T09:39:54.188Z
Learning: Applies to app/routes/**/*.{ts,tsx} : Use file-based routing with remix-flat-routes convention using the `+` folder syntax for organizing routes

Applied to files:

  • app/routes/_dashboard+/$organization._index/route.tsx
  • app/routes/admin+/create/route.tsx
  • app/routes/admin+/$organization.settings/forms/export-settings.action.server.ts
  • app/routes/admin+/$organization.settings/forms/delete-organization.tsx
  • app/routes/admin+/$organization.repositories._index/route.tsx
  • app/routes/admin+/$organization._layout/route.tsx
  • app/routes/admin+/$organization.repositories.$repository._index/route.tsx
  • app/routes/admin+/$organization.settings/route.tsx
  • app/routes/admin+/$organization.repositories.$repository.settings/route.tsx
  • app/routes/admin+/$organization.settings/forms/integration-settings.action.server.ts
  • app/routes/_dashboard+/$organization/route.tsx
  • app/routes/admin+/$organization.settings/forms/organization-settings.action.server.ts
  • app/routes/admin+/$organization.repositories.add/route.tsx
  • app/routes/admin+/$organization.repositories.tsx
  • CLAUDE.md
  • app/routes/admin+/$organization.repositories.$repository.$pull/route.tsx
  • app/routes/admin+/$organization.members/route.tsx
📚 Learning: 2026-01-10T09:39:54.188Z
Learnt from: CR
Repo: coji/upflow PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-10T09:39:54.188Z
Learning: Applies to **/{routes,services}/**/*.{ts,tsx} : Use Conform with Zod for type-safe form validation and parsing

Applied to files:

  • app/routes/admin+/$organization.settings/forms/export-settings.tsx
  • app/routes/admin+/create/route.tsx
  • app/routes/admin+/$organization.settings/forms/export-settings.action.server.ts
  • app/routes/admin+/$organization.settings/forms/delete-organization.tsx
  • app/routes/admin+/$organization.settings/forms/integration-settings.tsx
  • app/routes/admin+/$organization.settings/forms/delete-organization.action.server.ts
  • app/routes/admin+/$organization._layout/route.tsx
  • app/routes/admin+/$organization.repositories.$repository._index/route.tsx
  • package.json
  • app/routes/admin+/$organization.settings/route.tsx
  • app/routes/admin+/$organization.repositories.$repository.settings/route.tsx
  • app/routes/admin+/$organization.settings/forms/integration-settings.action.server.ts
  • app/routes/admin+/$organization.repositories.$repository.delete/route.tsx
  • app/routes/_dashboard+/$organization/route.tsx
  • app/routes/admin+/$organization.settings/forms/organization-settings.action.server.ts
  • app/routes/admin+/$organization.repositories.add/route.tsx
  • CLAUDE.md
  • app/routes/admin+/$organization.settings/forms/organization-settings.tsx
  • app/routes/admin+/$organization.members/route.tsx
📚 Learning: 2026-01-10T09:39:54.188Z
Learnt from: CR
Repo: coji/upflow PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-10T09:39:54.188Z
Learning: Applies to app/routes/**/*.{ts,tsx} : Use intent-based form action dispatch with ts-pattern for routes with multiple form actions

Applied to files:

  • app/routes/admin+/create/route.tsx
  • app/routes/admin+/$organization.repositories.$repository.settings/route.tsx
  • CLAUDE.md
📚 Learning: 2026-01-10T09:39:54.188Z
Learnt from: CR
Repo: coji/upflow PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-10T09:39:54.188Z
Learning: Applies to **/{routes,server,entry}/**/*.{ts,tsx} : Use React Router v7 in SSR mode with Express server for the web framework

Applied to files:

  • app/routes/admin+/create/route.tsx
  • app/routes/admin+/$organization.settings/forms/delete-organization.action.server.ts
  • app/routes/admin+/$organization._layout/route.tsx
  • app/routes/admin+/$organization.settings/forms/integration-settings.action.server.ts
  • app/routes/admin+/$organization.repositories.add/route.tsx
📚 Learning: 2026-01-10T09:39:54.188Z
Learnt from: CR
Repo: coji/upflow PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-10T09:39:54.188Z
Learning: Applies to **/{auth.server,*.auth}.ts : Use better-auth with Google OAuth for authentication, supporting organizations

Applied to files:

  • app/routes/admin+/$organization.settings/forms/delete-organization.action.server.ts
  • app/routes/admin+/$organization.settings/forms/integration-settings.action.server.ts
  • app/routes/admin+/$organization.settings/forms/organization-settings.action.server.ts
📚 Learning: 2026-01-10T09:39:54.188Z
Learnt from: CR
Repo: coji/upflow PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-10T09:39:54.188Z
Learning: Applies to app/components/**/*.{ts,tsx} : Use shadcn/ui components (new-york style) with Tailwind CSS v4 for UI

Applied to files:

  • app/routes/admin+/$organization.repositories.$repository.settings/route.tsx
🔇 Additional comments (26)
app/routes/admin+/$organization._layout/route.tsx (1)

1-1: LGTM! Import path correctly updated to Zod v4 compatible package.

The migration from zodix to @coji/zodix/v4 is correctly applied, and the API usage remains unchanged.

app/routes/admin+/$organization.repositories.$repository.delete/route.tsx (1)

1-1: LGTM! Import path correctly migrated to @coji/zodix/v4.

The package migration is properly applied with no changes to the API usage pattern.

app/routes/admin+/$organization.settings/forms/delete-organization.action.server.ts (1)

1-1: LGTM! Conform import path correctly updated to v4.

The migration to @conform-to/zod/v4 is properly applied with no functional changes.

app/routes/admin+/$organization.repositories._index/route.tsx (1)

1-1: LGTM! Import successfully migrated to @coji/zodix/v4.

The package path update is correct and maintains API compatibility.

app/routes/_dashboard+/$organization.ongoing/route.tsx (1)

1-1: Import migration to Zod v4 is complete and correct.

The import path at line 1 has been correctly updated to @coji/zodix/v4, and verification confirms no old zodix or @conform-to/zod imports remain anywhere in the codebase. All migrations are consistent and type-safe parameter parsing is properly implemented.

app/routes/admin+/$organization.repositories.$repository._index/route.tsx (1)

1-1: LGTM! Import path correctly updated for v4 migration.

The import path change from 'zodix' to '@coji/zodix/v4' is consistent with the PR's Zod v4 upgrade strategy.

app/routes/admin+/$organization.repositories.tsx (1)

1-1: LGTM! Import path correctly updated for v4 migration.

The import path change from 'zodix' to '@coji/zodix/v4' aligns with the PR's dependency migration strategy.

app/routes/admin+/$organization.settings/forms/export-settings.action.server.ts (1)

1-1: LGTM! Import path correctly updated for v4 migration.

The import path change from '@conform-to/zod' to '@conform-to/zod/v4' is consistent with the PR's migration to Zod v4.

app/routes/_dashboard+/$organization._index/route.tsx (2)

1-1: LGTM! Import path correctly updated for v4 migration.

The import path change from 'zodix' to '@coji/zodix/v4' aligns with the PR's Zod v4 upgrade strategy.


26-29: LGTM! Default value usage is compatible with Zod v4.

The .default(2.0) usage on the optional number schema is correctly structured for Zod v4, where default values must match the output type.

package.json (2)

27-27: @coji/zodix@0.7.0 is compatible with zod@4.3.5 and provides the /v4 subpath export.

The package exports ./v4 subpath as expected and declares peer dependency on zod ^3.25.0 || ^4.0.0, supporting the zod@4.3.5 version specified in the project.


29-29: @conform-to/zod@1.15.1 fully supports the /v4 subpath export.

The package exports include the ./v4 subpath, and the codebase successfully uses it across multiple routes and services with compatible peer dependencies (Zod 4.3.5).

app/routes/admin+/$organization.settings/forms/export-settings.tsx (1)

1-3: Good switch to @conform-to/zod/v4 for Conform validation. (Line 2)

app/routes/admin+/$organization.members/route.tsx (1)

1-3: @coji/zodix/v4 import + zx.parseParams usage is consistent with the Zod v4 upgrade. (Line 1)

app/routes/admin+/$organization.settings/forms/organization-settings.action.server.ts (1)

1-12: Action-side parsing migration to @conform-to/zod/v4 is fine; keeps Conform submission flow intact. (Line 1, Line 11)

app/routes/admin+/$organization.settings/forms/organization-settings.tsx (1)

1-9: Component-side Conform validation correctly moved to @conform-to/zod/v4. (Line 7)

app/routes/admin+/$organization.repositories.$repository.settings/route.tsx (1)

1-11: Zod v4 / zodix v4 imports are correct. Import migration is complete across the codebase with no legacy imports remaining. Lines 1 and 8 are properly updated and consistent with all other route files.

app/routes/_dashboard+/$organization/route.tsx (1)

1-1: LGTM! Import path updated to @coji/zodix/v4.

The import path change aligns with the Zod v4 upgrade. The usage of zx.parseParams remains compatible with the v4 API.

app/routes/admin+/$organization.settings/forms/delete-organization.tsx (1)

2-2: LGTM! Import path updated to @conform-to/zod/v4.

The import path change aligns with the Zod v4 upgrade and @conform-to/zod's v4 support. The client-side validation using parseWithZod in the onValidate callback remains compatible with the v4 API.

app/routes/admin+/$organization.settings/route.tsx (1)

1-1: LGTM! Import path updated to @coji/zodix/v4.

The import path change aligns with the Zod v4 upgrade. Both zx.parseParams and zx.parseForm usage patterns remain compatible with the v4 API, and intentsSchema uses proper Zod v4 syntax with no deprecated features.

app/routes/admin+/$organization.settings/forms/integration-settings.action.server.ts (1)

1-1: I don't have a review comment to rewrite. Please provide the review comment (within <review_comment> tags) along with any relevant code context so I can verify and rewrite it in the required format.

app/routes/admin+/$organization.repositories.$repository.$pull/route.tsx (1)

1-1: LGTM! Import and API usage are correct.

The zx.NumAsString helper is available in @coji/zodix v0.7.0 and is properly used in zx.parseParams at line 33 for type-safe parameter parsing.

CLAUDE.md (1)

142-143: LGTM! Documentation updated correctly.

The import paths have been updated to reference the v4 variants, which accurately reflects the library upgrade and provides correct examples for developers.

app/routes/admin+/$organization.settings/forms/integration-settings.tsx (1)

7-7: LGTM! Import path updated correctly.

The migration to @conform-to/zod/v4 is correct and consistent with the Zod v4 upgrade.

app/routes/admin+/create/route.tsx (1)

2-2: LGTM! Import path updated correctly.

The migration to @conform-to/zod/v4 is correct and maintains compatibility with existing usage.

app/routes/admin+/$organization.repositories.add/route.tsx (1)

1-2: LGTM! Import paths updated correctly.

Both imports have been successfully migrated to their v4 equivalents:

  • @coji/zodix/v4 for zodix functionality
  • @conform-to/zod/v4 for Conform integration

The usage throughout the file remains compatible.

@coji coji merged commit 29c4787 into main Jan 10, 2026
10 checks passed
@coji coji deleted the feat/zod-v4-upgrade branch January 10, 2026 11: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.

1 participant