zod-deep-extend

0.1.0 • Public • Published

zod-deep-extend

zod-deep-extend is a powerful utility for extending Zod schemas in a deep and recursive manner. It provides a simple and efficient way to add new fields to your existing Zod schemas, even for nested objects. This package is built on top of the Zod library, a TypeScript-first schema declaration and validation library.

Installation

You can install zod-deep-extend via npm:

npm install zod-deep-extend

Or via pnpm:

pnpm add zod-deep-extend

Usage

First, import the deepExtend function from the package:

import { deepExtend } from 'zod-deep-extend';

Then, define your original Zod schema:

import { z } from 'zod';

const originalSchema = z.object({
  name: z.string(),
  address: z.object({
    city: z.string(),
  }),
});

Now, you can extend your schema using deepExtend:

const extendedSchema = deepExtend(originalSchema, {
  email: z.string().email(),
  age: z.number().int(),
  address: z.object({
    street: z.string(),
    zip: z.string(),
    state: z.string()
  }),
});

You can now use your extended schema for validation:

const data = {
  name: 'John',
  age: 30,
  email: 'john@example.com',
  address: {
    street: '123 Main St',
    city: 'New York',
    state: 'NY',
    zip: '10001',
  },
};

const result = extendedSchema.safeParse(data);

if (result.success) {
  console.log('Data is valid!');
} else {
  console.log('Data is invalid:', result.error);
}

Why use zod-deep-extend?

Without zod-deep-extend, the above example would require accessing the internal shape of the original schema:

const extendedSchema = originalSchema.extend({
  email: z.string().email(),
  age: z.number().int(),
  address: originalSchema.shape.address.extend({
    street: z.string(),
    zip: z.string(),
    state: z.string()
  }),
});

This isn't so bad here, but it can get messy with a more complicated schema:

const extendedSchema = originalSchema.extend({
  profile: originalSchema.shape.profile.extend({
    preferences: originalSchema.shape.profile.shape.preferences.extend({
      game: originalSchema.shape.profile.shape.preferences.shape.game.extend({
        stats: originalSchema.shape.profile.shape.preferences.shape.game.shape.stats.extend({
          gameQuestionsAnswered: z.number(),
        }),
      }),
    }),
  }),
});

With zod-deep-extend, you can simply do this:

const extendedSchema = deepExtend(originalSchema, {
  profile: {
    preferences: {
      game: {
        stats: {
          gameQuestionsAnswered: z.number(),
        },
      },
    },
  },
});

Features

  • Deeply extend your Zod schemas with new fields.
  • Supports nested object schemas.
  • Maintains the original schema's type safety.
  • Provides clear error messages for invalid extensions.
  • Fully compatible with all Zod types.

Contributing

Contributions are always welcome. Feel free to open a pull request or a issue.

License

MIT

Conclusion

zod-deep-extend is a handy tool for those who want to extend their Zod schemas in a deep and recursive way. It simplifies the process of adding new fields to your schemas, making your code cleaner and easier to maintain. Try it out today!

Versions

Current Tags

  • Version
    Downloads (Last 7 Days)
    • Tag
  • 0.1.0
    0
    • latest

Version History

  • Version
    Downloads (Last 7 Days)
    • Published
  • 0.1.0
    0

Package Sidebar

Install

npm i zod-deep-extend

Weekly Downloads

0

Version

0.1.0

License

ISC

Unpacked Size

26.6 kB

Total Files

8

Last publish

Collaborators

  • ldlework