graphql-codegen-typescript-validation-schema
GraphQL code generator plugin to generate form validation schema from your GraphQL schema.
Quick Start
Start by installing this plugin and write simple plugin config;
$ npm i graphql-codegen-typescript-validation-schema
generates:
path/to/graphql.ts:
plugins:
- typescript
- typescript-validation-schema
config:
strictScalars: true
schema: yup
You can check example directory if you want to see more complex config example or how is generated some files.
...And I wrote some tips in there.
Config API Reference
schema
type: ValidationSchema
default: 'yup'
Specify generete validation schema you want.
You can specify yup
or zod
.
generates:
path/to/graphql.ts:
plugins:
- typescript
- typescript-validation-schema
config:
schema: yup
importFrom
type: string
When provided, import types from the generated typescript types file path. if not given, omit import statement.
generates:
path/to/graphql.ts:
plugins:
- typescript
path/to/validation.ts:
plugins:
- typescript-validation-schema
config:
importFrom: ./graphql
Then the generator generates code with import statement like below.
import { GeneratedInput } from './graphql'
enumsAsTypes
type: boolean
default: false
Generates enum as TypeScript type
instead of enum
.
directives
type: DirectiveConfig
Generates validation schema with more API based on directive schema. For example, yaml config and GraphQL schema is here.
input ExampleInput {
email: String! @required(msg: "Hello, World!") @constraint(minLength: 50, format: "email")
message: String! @constraint(startsWith: "Hello")
}
yup schema
generates:
path/to/graphql.ts:
plugins:
- typescript
- typescript-validation-schema
config:
schema: yup
directives:
required:
msg: required
constraint:
minLength: min
startsWith: ["matches", "/^$1/"]
format:
email: email
Then generates yup validation schema like below.
export function ExampleInputSchema(): yup.SchemaOf<ExampleInput> {
return yup.object({
email: yup.string().defined().required("Hello, World!").min(50).email(),
message: yup.string().defined().matches(/^Hello/)
})
}
zod schema
generates:
path/to/graphql.ts:
plugins:
- typescript
- typescript-validation-schema
config:
schema: zod
directives:
constraint:
minLength: min
startsWith: ["regex", "/^$1/", "message"]
format:
email: email
Then generates zod validation schema like below.
export function ExampleInputSchema(): z.ZodSchema<ExampleInput> {
return z.object({
email: z.string().min(50).email(),
message: z.string().regex(/^Hello/, "message")
})
}