Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Idea: .meta(...) method on ZodType #3744

Open
mmkal opened this issue Sep 6, 2024 · 1 comment
Open

Idea: .meta(...) method on ZodType #3744

mmkal opened this issue Sep 6, 2024 · 1 comment

Comments

@mmkal
Copy link
Contributor

mmkal commented Sep 6, 2024

I've considered asking this for a bit, for the sake of trpc-cli. So far, it takes advantage of .describe('...') to allow adding CLI docs for zod input parameters, but it would be nice to add richer metadata.

How I think it could work:

  1. Define a new ZodMeta interface (maybe make it generic with the same typeargs as ZodType)
  2. Only add a description property to it
  3. Add a metadata: ZodMeta prop to ZodType
  4. Have .describe('foo') update the metadata to { description: 'foo' } (maybe shallow-merging the old value?)
  5. Update the description property of ZodType to get description() { return this.metadata.description } for backwards-compatibility

The fun part would be: end users could then use module augmentation to add to ZodMeta however they like, e.g. I in trpc-cli could do:

import {z} from 'zod'

declare module 'zod' {
  export interface ZodMeta {
    alias: string
  }
}

const router = t.router({
  test: t.input(
    z.object({
      glob: z.string().meta({
        description: 'Glob pattern for test files',
        alias: 'g',
      })
    })
  ).mutation(...)
)

Looking at the issues, I think this would cover a few requests zod has got:

#3734
#3732
#3736 (maybe)
#3673
#1439

Possible more but I didn't go that far back in the issues. In general, with trpc and OpenAI adopting zod, there will be more cases where people use zod as a user-facing part of their libraries and applications, so there might be more and more requests for the ability to attach metadat to types

Alternatively, these fields could somehow be dumped onto ZodDef, which is where description lives now but that doesn't feel quite right to me.

@klh
Copy link

klh commented Sep 13, 2024

i like the idea of removing all the non entity related stuff to a meta field, it would make it more consistent across types

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

No branches or pull requests

2 participants