[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:

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!