Skip to main content

Zod Version Compatibility

UltraFastBuilder provides full support for both Zod v3 and v4, with automatic detection and backward compatibility built into the core library.

Version Support​

Zod VersionSupport StatusNotes
v4.0.0+✅ Fully SupportedRecommended for new projects
v3.22.0+✅ Fully SupportedMaintained for backward compatibility
< v3.22.0⚠️ LimitedMay work but not tested

Installation​

For New Projects (Zod v4)​

npm install @noony-serverless/type-builder zod

This will install the latest versions of both packages, including Zod v4.

For Existing Projects (Zod v3)​

If your project already uses Zod v3, UltraFastBuilder will work seamlessly:

npm install @noony-serverless/type-builder
# Your existing zod@^3.22.0 will continue to work

Upgrading from Zod v3 to v4​

npm install zod@^4.0.0
# UltraFastBuilder automatically detects and supports both versions

Automatic Version Detection​

UltraFastBuilder automatically detects which version of Zod you're using and adapts accordingly. No configuration needed!

import { builder } from '@noony-serverless/type-builder';
import { z } from 'zod';

// Works with both Zod v3 and v4
const UserSchema = z.object({
name: z.string(),
email: z.string().email(),
});

const createUser = builder(UserSchema);
// ✅ Auto-detects Zod version and works perfectly

Zod v4 Breaking Changes (Handled by UltraFastBuilder)​

UltraFastBuilder handles all Zod v4 breaking changes internally. Here's what changed and how we handle it:

1. Internal Property Access​

Zod v3:

// Internal: _def property
schema._def.shape();

Zod v4:

// Internal: _zod.def property
schema._zod.def.shape();

How UltraFastBuilder Handles It:

  • ✅ Automatically checks both locations
  • ✅ Falls back gracefully between versions
  • ✅ No action needed from you

2. Shape Access Method​

Zod v3:

// _def.shape was a function
const shape = schema._def.shape();

Zod v4:

// .shape is now a property (getter)
const shape = schema.shape;

How UltraFastBuilder Handles It:

  • ✅ Detects whether shape is a function or property
  • ✅ Calls appropriately based on version
  • ✅ No action needed from you

3. Type Generic Structure​

Zod v3:

class ZodType<Output, Def extends ZodTypeDef, Input = Output>

Zod v4:

class ZodType<Output, Input = Output>
// Def generic removed for simpler types

How UltraFastBuilder Handles It:

  • ✅ Conditional type inference supports both structures
  • ✅ Full TypeScript type safety maintained
  • ✅ No action needed from you

Zod v4 API Changes (Your Code)​

Some Zod API changes require updates in your application code:

z.record() Requires Two Arguments​

Zod v3:

const MetadataSchema = z.object({
metadata: z.record(z.any()), // One argument
});

Zod v4:

const MetadataSchema = z.object({
metadata: z.record(z.string(), z.any()), // Two arguments: key type, value type
});

Migration:

// ❌ Zod v3 syntax (no longer works in v4)
z.record(z.any());

// ✅ Zod v4 syntax (works, more explicit)
z.record(z.string(), z.any());

Common z.record() Patterns​

// String keys with any values
z.record(z.string(), z.any());

// String keys with typed values
z.record(z.string(), z.number());
z.record(z.string(), z.boolean());

// Specific string keys (enum-like)
z.record(z.enum(['admin', 'user', 'guest']), z.boolean());

// Number keys (if needed)
z.record(z.number(), z.string());

Migration Guide​

Step 1: Check Your Zod Version​

npm list zod

Step 2: Update Zod (Optional)​

# Upgrade to Zod v4
npm install zod@^4.0.0

Step 3: Update Your z.record() Usage​

Search for z.record( in your codebase:

grep -r "z.record(" src/

Update any single-argument z.record() calls to use two arguments:

// Before (Zod v3)
metadata: z.record(z.any());
config: z.record(z.string());
settings: z.record(z.number());

// After (Zod v4)
metadata: z.record(z.string(), z.any());
config: z.record(z.string(), z.string());
settings: z.record(z.string(), z.number());

Step 4: Test Your Application​

# Run your tests
npm test

# Build your project
npm run build

Step 5: No Changes Needed for UltraFastBuilder​

UltraFastBuilder code remains the same:

import { builder } from '@noony-serverless/type-builder';

// This works with both Zod v3 and v4
const createUser = builder(UserSchema);
const user = createUser().withName('John').withEmail('john@example.com').build();

TypeScript Type Inference​

Both versions provide full type inference:

Zod v3​

const UserSchema = z.object({
id: z.number(),
name: z.string(),
});

const createUser = builder(UserSchema);
// TypeScript infers: FluentBuilder<{ id: number; name: string }>

Zod v4​

const UserSchema = z.object({
id: z.number(),
name: z.string(),
});

const createUser = builder(UserSchema);
// TypeScript infers: FluentBuilder<{ id: number; name: string }>

Type inference works identically in both versions!

Compatibility Guarantee​

UltraFastBuilder commits to:

✅ Support both Zod v3 and v4 indefinitely ✅ Automatic version detection with no configuration ✅ Backward compatibility for existing codebases ✅ Type safety maintained across both versions ✅ No breaking changes in the builder API

Troubleshooting​

Issue: TypeScript errors with z.record()​

Error:

Expected 2-3 arguments, but got 1.

Solution: You're using Zod v4 with v3 syntax. Update your z.record() calls:

// ❌ This
z.record(z.any());

// ✅ Change to this
z.record(z.string(), z.any());

Issue: Version mismatch between dependencies​

Error:

Type 'ZodObject<...>' is not assignable to type 'ZodType<...>'

Solution: Ensure all packages use compatible Zod versions:

# Check Zod versions across all dependencies
npm list zod

# If multiple versions found, deduplicate
npm dedupe

Issue: Type inference not working​

Solution: Ensure your TypeScript version is up to date:

npm install -D typescript@^5.0.0

Configure tsconfig.json for strict mode:

{
"compilerOptions": {
"strict": true,
"strictNullChecks": true,
"noUncheckedIndexedAccess": true
}
}

Working Examples​

Complete Example (Works with Both Versions)​

import { builder } from '@noony-serverless/type-builder';
import { z } from 'zod';

// Define schema (Zod v4 syntax shown)
const UserSchema = z.object({
id: z.number(),
name: z.string().min(2).max(50),
email: z.string().email(),
age: z.number().min(0).max(120),
metadata: z.record(z.string(), z.any()), // v4 syntax
tags: z.array(z.string()),
});

// Create builder (works with both Zod v3 and v4)
const createUser = builder(UserSchema);

// Use builder
try {
const user = createUser()
.withId(1)
.withName('John Doe')
.withEmail('john@example.com')
.withAge(30)
.withMetadata({ role: 'admin', source: 'api' })
.withTags(['premium', 'verified'])
.build();

console.log('✅ User created:', user);
} catch (error) {
if (error instanceof z.ZodError) {
console.error('❌ Validation failed:', error.errors);
}
}

Async Validation Example​

import { builderAsync } from '@noony-serverless/type-builder';
import { z } from 'zod';

const UserSchema = z.object({
email: z.string().email(),
password: z.string().min(8),
});

// Works with both Zod v3 and v4
const createUserAsync = builderAsync(UserSchema);

async function registerUser(input: any) {
try {
const user = await createUserAsync()
.withEmail(input.email)
.withPassword(input.password)
.buildAsync(); // Non-blocking validation

return { success: true, user };
} catch (error) {
if (error instanceof z.ZodError) {
return { success: false, errors: error.errors };
}
throw error;
}
}

Performance Impact​

Version detection has zero performance impact at runtime:

  • Detection happens once during builder creation
  • Cached for subsequent uses
  • No overhead during .build() calls
  • Same performance for both Zod v3 and v4

Best Practices​

1. Use Zod v4 for New Projects​

# Start with the latest
npm install @noony-serverless/type-builder zod@^4.0.0

2. Migrate Gradually for Existing Projects​

  1. Update z.record() usage first
  2. Run tests to verify everything works
  3. Upgrade Zod when convenient
  4. UltraFastBuilder handles the rest

3. Pin Zod Version in package.json​

{
"dependencies": {
"@noony-serverless/type-builder": "^1.2.0",
"zod": "^4.0.0"
}
}

4. Document Your Zod Version​

Add to your project README:

## Dependencies

- Zod v4.0+ for schema validation
- UltraFastBuilder v1.2+ (compatible with Zod v3 and v4)

Further Resources​

Need Help?​

If you encounter issues with Zod version compatibility:

  1. Check this guide for common solutions
  2. Verify your Zod version: npm list zod
  3. Report issues at GitHub Issues