Code-Hex/graphql-codegen-typescript-validation-schema

[Feature Request] Allow functions in directive parameters

elijaholmos opened this issue · 3 comments

I have a use case where I would like to be able to pass more than just a string as a directive argument. For example, if I have a directive designed to enforce uniqueness on arrays (in Zod), I would want to use the refine() method like so:

z.array(z.string()).refine(items => new Set(items).size === items.length);

Translating this to typescript-validation-schema:

directive @array(
  unique: Boolean = false
) on INPUT_FIELD_DEFINITION | FIELD_DEFINITION | ARGUMENT_DEFINITION

input TestInput {
	userIds: [Int] @array(unique: true)
}

With my CodegenConfig defined in a TypeScript file: (https://the-guild.dev/graphql/codegen/docs/config-reference/codegen-config)

import type { CodegenConfig } from '@graphql-codegen/cli';

const config: CodegenConfig = {
  overwrite: true,
  watch: false, 
  // ... other config ...
  generates: {
    'graphql/typings.ts': {
      plugins: [
        'typescript',
        'typescript-validation-schema',
      ],
      config: {
        strictScalars: true,
        schema: 'zod',
        directives: {
          array: {
            unique: ['refine', (items) => new Set(items).size === items.length],	// function passed as argument
          },
        },
      },
    },
  },
};

export default config;

However, that directive configuration yields the following error:
image

My request is that the typescript-validation-schema package can support receiving functions as arguments for custom directive definitions.

@elijaholmos Thanks for your suggestion!
I agree to accept this feature request. but this feature is difficult to treat in YAML configuration. Do you have any ideas?

graphql-codegen encourages the use of a typescript-based configuration by default, which naturally offers substantially more features than its yaml counterpart. We could perhaps simply not support this feature if a yaml configuration is present, as that would indeed be cumbersome to work with.

@elijaholmos Could you give me PR for this implementation? Thanks!