Repository files navigation

graphql-codegen-typescript-validation-schema

Testnpm version

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 # specify to use this pluginconfig:
# You can put the config for typescript plugin here# see: https://www.graphql-code-generator.com/plugins/typescriptstrictScalars: true# Overrides built-in ID scalar to both input and output types as string.# see: https://the-guild.dev/graphql/codegen/plugins/typescript/typescript#scalarsscalars:
ID: string# You can also write the config for this plugin togetherschema: yup # or zod

It is recommended to write scalars config for built-in type ID, as in the yaml example shown above. For more information: #375

You can check example directory if you want to see more complex config example or how is generated some files.

The Q&A for each schema is written in the README in the respective example directory.

Config API Reference

schema

type: ValidationSchema default: 'yup'

Specify generete validation schema you want.

You can specify yup or zod or myzod.

generates:
path/to/graphql.ts:
plugins:
- typescript
- typescript-validation-schemaconfig:
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:
- typescriptpath/to/validation.ts:
plugins:
- typescript-validation-schemaconfig:
importFrom: ./graphql # path for generated ts code

Then the generator generates code with import statement like below.

import{GeneratedInput}from'./graphql';/* generates validation schema here */

schemaNamespacedImportName

type: string

If defined, will use named imports from the specified module (defined in importFrom) rather than individual imports for each type.

generates:
path/to/types.ts:
plugins:
- typescriptpath/to/schemas.ts:
plugins:
- graphql-codegen-validation-schemaconfig:
schema: yupimportFrom: ./path/to/typesschemaNamespacedImportName: types

Then the generator generates code with import statement like below.

import*astypesfrom'./graphql';/* generates validation schema here */

useTypeImports

type: boolean default: false

Will use import type {} rather than import {} when importing generated TypeScript types. This gives compatibility with TypeScript's "importsNotUsedAsValues": "error" option. Should used in conjunction with importFrom option.

typesPrefix

type: string default: (empty)

Prefixes all import types from generated typescript type.

generates:
path/to/graphql.ts:
plugins:
- typescriptpath/to/validation.ts:
plugins:
- typescript-validation-schemaconfig:
typesPrefix: IimportFrom: ./graphql # path for generated ts code

Then the generator generates code with import statement like below.

import{IGeneratedInput}from'./graphql';/* generates validation schema here */

typesSuffix

type: string default: (empty)

Suffixes all import types from generated typescript type.

generates:
path/to/graphql.ts:
plugins:
- typescriptpath/to/validation.ts:
plugins:
- typescript-validation-schemaconfig:
typesSuffix: IimportFrom: ./graphql # path for generated ts code

Then the generator generates code with import statement like below.

import{GeneratedInputI}from'./graphql';/* generates validation schema here */

enumsAsTypes

type: boolean default: false

Generates enum as TypeScript type instead of enum.

notAllowEmptyString

type: boolean default: false

Generates validation string schema as do not allow empty characters by default.

scalarSchemas

type: ScalarSchemas

Extends or overrides validation schema for the built-in scalars and custom GraphQL scalars.

yup schema

config:
schema: yupscalarSchemas:
Date: yup.date()Email: yup.string().email()

zod schema

config:
schema: zodscalarSchemas:
Date: z.date()Email: z.string().email()

defaultScalarTypeSchema

type: string

Fallback scalar type for undefined scalar types in the schema not found in scalarSchemas.

yup schema

config:
schema: yupdefaultScalarSchema: yup.unknown()

zod schema

config:
schema: zoddefaultScalarSchema: z.unknown()

withObjectType

type: boolean default: false

Generates validation schema with GraphQL type objects. But excludes Query, Mutation, Subscription objects.

It is currently added for the purpose of using simple objects. See also #20, #107.

This option currently does not support fragment generation. If you are interested, send me PR would be greatly appreciated!

validationSchemaExportType

type: ValidationSchemaExportType default: 'function'

Specify validation schema export type.

useEnumTypeAsDefaultValue

type: boolean default: false

Uses the full path of the enum type as the default value instead of the stringified value.

namingConvention

type: NamingConventionMap default: { enumValues: "change-case-all#pascalCase" }

Uses the full path of the enum type as the default value instead of the stringified value.

Related: https://the-guild.dev/graphql/codegen/docs/config-reference/naming-convention#namingconvention

withOperationVariables

type: boolean default: false

Generates validation schemas for GraphQL operation variables (query, mutation, subscription parameters).

generates:
path/to/file.ts:
plugins:
- typescript
- typescript-operations
- graphql-codegen-validation-schemaconfig:
schema: zodwithOperationVariables: true

When enabled, the plugin will generate validation schemas for each named GraphQL operation's variables. For example, given this query:

queryEditor_StoryQuery($storyId: UUID!) {
story(id: $storyId) {
idtitle
}
}

It will generate:

exportfunctionEditor_StoryQueryVariableSchema(): z.ZodObject<Properties<Editor_StoryQueryQueryVariables>>{returnz.object({storyId: z.string()});}

The generated schemas properly handle:

  • Required vs optional variables
  • Default values
  • References to existing input type schemas
  • All GraphQL scalar types
  • Enum types
  • Array types

operationVariablesSchemaSuffix

type: string default: 'VariableSchema'

Suffix for operation variable schema names when withOperationVariables is enabled.

generates:
path/to/file.ts:
plugins:
- typescript-operations
- graphql-codegen-validation-schemaconfig:
schema: zodwithOperationVariables: trueoperationVariablesSchemaSuffix: VarsSchema

This will generate schema names like Editor_StoryQueryVarsSchema instead of Editor_StoryQueryVariableSchema.

directives

type: DirectiveConfig

Generates validation schema with more API based on directive schema. For example, yaml config and GraphQL schema is here.

inputExampleInput {
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-schemaconfig:
schema: yupdirectives:
# Write directives like## directive:# arg1: schemaApi# arg2: ["schemaApi2", "Hello $1"]## See more examples in `./tests/directive.spec.ts`# https://github.com/Code-Hex/graphql-codegen-typescript-validation-schema/blob/main/tests/directive.spec.tsrequired:
msg: requiredconstraint:
minLength: min# Replace $1 with specified `startsWith` argument value of the constraint directivestartsWith: [matches, /^$1/]format:
# This example means `validation-schema: directive-arg`# directive-arg is supported String and Enum.email: email

Then generates yup validation schema like below.

exportfunctionExampleInputSchema(): yup.SchemaOf<ExampleInput>{returnyup.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-schemaconfig:
schema: zoddirectives:
# Write directives like## directive:# arg1: schemaApi# arg2: ["schemaApi2", "Hello $1"]## See more examples in `./tests/directive.spec.ts`# https://github.com/Code-Hex/graphql-codegen-typescript-validation-schema/blob/main/tests/directive.spec.tsconstraint:
minLength: min# Replace $1 with specified `startsWith` argument value of the constraint directivestartsWith: [regex, /^$1/, message]format:
# This example means `validation-schema: directive-arg`# directive-arg is supported String and Enum.email: email

Then generates zod validation schema like below.

exportfunctionExampleInputSchema(): z.ZodSchema<ExampleInput>{returnz.object({email: z.string().min(50).email(),message: z.string().regex(/^Hello/,'message')});}

other schema

Please see example directory.

Operation Variables Validation

This plugin supports generating validation schemas for GraphQL operation variables (queries, mutations, subscriptions). This is useful for validating user input before sending GraphQL operations.

Basic Usage

generates:
path/to/types.ts:
plugins:
- typescript
- typescript-operationspath/to/schemas.ts:
plugins:
- graphql-codegen-validation-schemaconfig:
schema: zodimportFrom: ./typeswithOperationVariables: true

Examples

Given these GraphQL operations:

queryGetUser($id: ID!, $includeProfile: Boolean = false) {
user(id: $id) {
idnameprofile@include(if: $includeProfile) {
bio
}
}
}
mutationCreatePost($input: CreatePostInput!) {
createPost(input: $input) {
idtitle
}
}

The plugin will generate validation schemas like:

Zod

exportfunctionGetUserVariableSchema(): z.ZodObject<Properties<GetUserQueryVariables>>{returnz.object({id: z.string(),includeProfile: z.boolean().default(false).optional()});}exportfunctionCreatePostVariableSchema(): z.ZodObject<Properties<CreatePostMutationVariables>>{returnz.object({input: CreatePostInputSchema()});}

Yup

exportfunctionGetUserVariableSchema(): yup.SchemaOf<GetUserQueryVariables>{returnyup.object({id: yup.string().defined(),includeProfile: yup.boolean().default(false).optional()});}exportfunctionCreatePostVariableSchema(): yup.SchemaOf<CreatePostMutationVariables>{returnyup.object({input: CreatePostInputSchema().defined()});}

Features

  • Type Safety: Generated schemas reference the correct TypeScript operation variable types
  • Smart Defaults: Handles GraphQL default values automatically
  • Input Type References: Automatically references existing input type schemas
  • Nullable/Optional Handling: Properly distinguishes between required and optional variables
  • All Validation Libraries: Works with zod, yup, myzod, and valibot
  • Configurable Naming: Customize schema naming with operationVariablesSchemaSuffix

Notes

Their is currently a compatibility issue with the client-preset. A workaround for this is to split the generation into two (one for client-preset and one for typescript-validation-schema).

generates:
path/to/graphql.ts:
plugins:
- typescript-validation-schema/path/to/graphql/:
preset: 'client',plugins:
...

About

GraphQL Code Generator plugin to generate validation schemas

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

graphql-codegen-typescript-validation-schema

Testnpm version

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 # specify to use this pluginconfig:
# You can put the config for typescript plugin here# see: https://www.graphql-code-generator.com/plugins/typescriptstrictScalars: true# Overrides built-in ID scalar to both input and output types as string.# see: https://the-guild.dev/graphql/codegen/plugins/typescript/typescript#scalarsscalars:
ID: string# You can also write the config for this plugin togetherschema: yup # or zod

It is recommended to write scalars config for built-in type ID, as in the yaml example shown above. For more information: #375

You can check example directory if you want to see more complex config example or how is generated some files.

The Q&A for each schema is written in the README in the respective example directory.

Config API Reference

schema

type: ValidationSchema default: 'yup'

Specify generete validation schema you want.

You can specify yup or zod or myzod.

generates:
path/to/graphql.ts:
plugins:
- typescript
- typescript-validation-schemaconfig:
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:
- typescriptpath/to/validation.ts:
plugins:
- typescript-validation-schemaconfig:
importFrom: ./graphql # path for generated ts code

Then the generator generates code with import statement like below.

import{GeneratedInput}from'./graphql';/* generates validation schema here */

schemaNamespacedImportName

type: string

If defined, will use named imports from the specified module (defined in importFrom) rather than individual imports for each type.

generates:
path/to/types.ts:
plugins:
- typescriptpath/to/schemas.ts:
plugins:
- graphql-codegen-validation-schemaconfig:
schema: yupimportFrom: ./path/to/typesschemaNamespacedImportName: types

Then the generator generates code with import statement like below.

import*astypesfrom'./graphql';/* generates validation schema here */

useTypeImports

type: boolean default: false

Will use import type {} rather than import {} when importing generated TypeScript types. This gives compatibility with TypeScript's "importsNotUsedAsValues": "error" option. Should used in conjunction with importFrom option.

typesPrefix

type: string default: (empty)

Prefixes all import types from generated typescript type.

generates:
path/to/graphql.ts:
plugins:
- typescriptpath/to/validation.ts:
plugins:
- typescript-validation-schemaconfig:
typesPrefix: IimportFrom: ./graphql # path for generated ts code

Then the generator generates code with import statement like below.

import{IGeneratedInput}from'./graphql';/* generates validation schema here */

typesSuffix

type: string default: (empty)

Suffixes all import types from generated typescript type.

generates:
path/to/graphql.ts:
plugins:
- typescriptpath/to/validation.ts:
plugins:
- typescript-validation-schemaconfig:
typesSuffix: IimportFrom: ./graphql # path for generated ts code

Then the generator generates code with import statement like below.

import{GeneratedInputI}from'./graphql';/* generates validation schema here */

enumsAsTypes

type: boolean default: false

Generates enum as TypeScript type instead of enum.

notAllowEmptyString

type: boolean default: false

Generates validation string schema as do not allow empty characters by default.

scalarSchemas

type: ScalarSchemas

Extends or overrides validation schema for the built-in scalars and custom GraphQL scalars.

yup schema

config:
schema: yupscalarSchemas:
Date: yup.date()Email: yup.string().email()

zod schema

config:
schema: zodscalarSchemas:
Date: z.date()Email: z.string().email()

defaultScalarTypeSchema

type: string

Fallback scalar type for undefined scalar types in the schema not found in scalarSchemas.

yup schema

config:
schema: yupdefaultScalarSchema: yup.unknown()

zod schema

config:
schema: zoddefaultScalarSchema: z.unknown()

withObjectType

type: boolean default: false

Generates validation schema with GraphQL type objects. But excludes Query, Mutation, Subscription objects.

It is currently added for the purpose of using simple objects. See also #20, #107.

This option currently does not support fragment generation. If you are interested, send me PR would be greatly appreciated!

validationSchemaExportType

type: ValidationSchemaExportType default: 'function'

Specify validation schema export type.

useEnumTypeAsDefaultValue

type: boolean default: false

Uses the full path of the enum type as the default value instead of the stringified value.

namingConvention

type: NamingConventionMap default: { enumValues: "change-case-all#pascalCase" }

Uses the full path of the enum type as the default value instead of the stringified value.

Related: https://the-guild.dev/graphql/codegen/docs/config-reference/naming-convention#namingconvention

withOperationVariables

type: boolean default: false

Generates validation schemas for GraphQL operation variables (query, mutation, subscription parameters).

generates:
path/to/file.ts:
plugins:
- typescript
- typescript-operations
- graphql-codegen-validation-schemaconfig:
schema: zodwithOperationVariables: true

When enabled, the plugin will generate validation schemas for each named GraphQL operation's variables. For example, given this query:

queryEditor_StoryQuery($storyId: UUID!) {
story(id: $storyId) {
idtitle
}
}

It will generate:

exportfunctionEditor_StoryQueryVariableSchema(): z.ZodObject<Properties<Editor_StoryQueryQueryVariables>>{returnz.object({storyId: z.string()});}

The generated schemas properly handle:

  • Required vs optional variables
  • Default values
  • References to existing input type schemas
  • All GraphQL scalar types
  • Enum types
  • Array types

operationVariablesSchemaSuffix

type: string default: 'VariableSchema'

Suffix for operation variable schema names when withOperationVariables is enabled.

generates:
path/to/file.ts:
plugins:
- typescript-operations
- graphql-codegen-validation-schemaconfig:
schema: zodwithOperationVariables: trueoperationVariablesSchemaSuffix: VarsSchema

This will generate schema names like Editor_StoryQueryVarsSchema instead of Editor_StoryQueryVariableSchema.

directives

type: DirectiveConfig

Generates validation schema with more API based on directive schema. For example, yaml config and GraphQL schema is here.

inputExampleInput {
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-schemaconfig:
schema: yupdirectives:
# Write directives like## directive:# arg1: schemaApi# arg2: ["schemaApi2", "Hello $1"]## See more examples in `./tests/directive.spec.ts`# https://github.com/Code-Hex/graphql-codegen-typescript-validation-schema/blob/main/tests/directive.spec.tsrequired:
msg: requiredconstraint:
minLength: min# Replace $1 with specified `startsWith` argument value of the constraint directivestartsWith: [matches, /^$1/]format:
# This example means `validation-schema: directive-arg`# directive-arg is supported String and Enum.email: email

Then generates yup validation schema like below.

exportfunctionExampleInputSchema(): yup.SchemaOf<ExampleInput>{returnyup.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-schemaconfig:
schema: zoddirectives:
# Write directives like## directive:# arg1: schemaApi# arg2: ["schemaApi2", "Hello $1"]## See more examples in `./tests/directive.spec.ts`# https://github.com/Code-Hex/graphql-codegen-typescript-validation-schema/blob/main/tests/directive.spec.tsconstraint:
minLength: min# Replace $1 with specified `startsWith` argument value of the constraint directivestartsWith: [regex, /^$1/, message]format:
# This example means `validation-schema: directive-arg`# directive-arg is supported String and Enum.email: email

Then generates zod validation schema like below.

exportfunctionExampleInputSchema(): z.ZodSchema<ExampleInput>{returnz.object({email: z.string().min(50).email(),message: z.string().regex(/^Hello/,'message')});}

other schema

Please see example directory.

Operation Variables Validation

This plugin supports generating validation schemas for GraphQL operation variables (queries, mutations, subscriptions). This is useful for validating user input before sending GraphQL operations.

Basic Usage

generates:
path/to/types.ts:
plugins:
- typescript
- typescript-operationspath/to/schemas.ts:
plugins:
- graphql-codegen-validation-schemaconfig:
schema: zodimportFrom: ./typeswithOperationVariables: true

Examples

Given these GraphQL operations:

queryGetUser($id: ID!, $includeProfile: Boolean = false) {
user(id: $id) {
idnameprofile@include(if: $includeProfile) {
bio
}
}
}
mutationCreatePost($input: CreatePostInput!) {
createPost(input: $input) {
idtitle
}
}

The plugin will generate validation schemas like:

Zod

exportfunctionGetUserVariableSchema(): z.ZodObject<Properties<GetUserQueryVariables>>{returnz.object({id: z.string(),includeProfile: z.boolean().default(false).optional()});}exportfunctionCreatePostVariableSchema(): z.ZodObject<Properties<CreatePostMutationVariables>>{returnz.object({input: CreatePostInputSchema()});}

Yup

exportfunctionGetUserVariableSchema(): yup.SchemaOf<GetUserQueryVariables>{returnyup.object({id: yup.string().defined(),includeProfile: yup.boolean().default(false).optional()});}exportfunctionCreatePostVariableSchema(): yup.SchemaOf<CreatePostMutationVariables>{returnyup.object({input: CreatePostInputSchema().defined()});}

Features

  • Type Safety: Generated schemas reference the correct TypeScript operation variable types
  • Smart Defaults: Handles GraphQL default values automatically
  • Input Type References: Automatically references existing input type schemas
  • Nullable/Optional Handling: Properly distinguishes between required and optional variables
  • All Validation Libraries: Works with zod, yup, myzod, and valibot
  • Configurable Naming: Customize schema naming with operationVariablesSchemaSuffix

Notes

Their is currently a compatibility issue with the client-preset. A workaround for this is to split the generation into two (one for client-preset and one for typescript-validation-schema).

generates:
path/to/graphql.ts:
plugins:
- typescript-validation-schema/path/to/graphql/:
preset: 'client',plugins:
...

About

GraphQL Code Generator plugin to generate validation schemas

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

graphql-codegen-typescript-validation-schema

Testnpm version

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 # specify to use this pluginconfig:
# You can put the config for typescript plugin here# see: https://www.graphql-code-generator.com/plugins/typescriptstrictScalars: true# Overrides built-in ID scalar to both input and output types as string.# see: https://the-guild.dev/graphql/codegen/plugins/typescript/typescript#scalarsscalars:
ID: string# You can also write the config for this plugin togetherschema: yup # or zod

It is recommended to write scalars config for built-in type ID, as in the yaml example shown above. For more information: #375

You can check example directory if you want to see more complex config example or how is generated some files.

The Q&A for each schema is written in the README in the respective example directory.

Config API Reference

schema

type: ValidationSchema default: 'yup'

Specify generete validation schema you want.

You can specify yup or zod or myzod.

generates:
path/to/graphql.ts:
plugins:
- typescript
- typescript-validation-schemaconfig:
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:
- typescriptpath/to/validation.ts:
plugins:
- typescript-validation-schemaconfig:
importFrom: ./graphql # path for generated ts code

Then the generator generates code with import statement like below.

import{GeneratedInput}from'./graphql';/* generates validation schema here */

schemaNamespacedImportName

type: string

If defined, will use named imports from the specified module (defined in importFrom) rather than individual imports for each type.

generates:
path/to/types.ts:
plugins:
- typescriptpath/to/schemas.ts:
plugins:
- graphql-codegen-validation-schemaconfig:
schema: yupimportFrom: ./path/to/typesschemaNamespacedImportName: types

Then the generator generates code with import statement like below.

import*astypesfrom'./graphql';/* generates validation schema here */

useTypeImports

type: boolean default: false

Will use import type {} rather than import {} when importing generated TypeScript types. This gives compatibility with TypeScript's "importsNotUsedAsValues": "error" option. Should used in conjunction with importFrom option.

typesPrefix

type: string default: (empty)

Prefixes all import types from generated typescript type.

generates:
path/to/graphql.ts:
plugins:
- typescriptpath/to/validation.ts:
plugins:
- typescript-validation-schemaconfig:
typesPrefix: IimportFrom: ./graphql # path for generated ts code

Then the generator generates code with import statement like below.

import{IGeneratedInput}from'./graphql';/* generates validation schema here */

typesSuffix

type: string default: (empty)

Suffixes all import types from generated typescript type.

generates:
path/to/graphql.ts:
plugins:
- typescriptpath/to/validation.ts:
plugins:
- typescript-validation-schemaconfig:
typesSuffix: IimportFrom: ./graphql # path for generated ts code

Then the generator generates code with import statement like below.

import{GeneratedInputI}from'./graphql';/* generates validation schema here */

enumsAsTypes

type: boolean default: false

Generates enum as TypeScript type instead of enum.

notAllowEmptyString

type: boolean default: false

Generates validation string schema as do not allow empty characters by default.

scalarSchemas

type: ScalarSchemas

Extends or overrides validation schema for the built-in scalars and custom GraphQL scalars.

yup schema

config:
schema: yupscalarSchemas:
Date: yup.date()Email: yup.string().email()

zod schema

config:
schema: zodscalarSchemas:
Date: z.date()Email: z.string().email()

defaultScalarTypeSchema

type: string

Fallback scalar type for undefined scalar types in the schema not found in scalarSchemas.

yup schema

config:
schema: yupdefaultScalarSchema: yup.unknown()

zod schema

config:
schema: zoddefaultScalarSchema: z.unknown()

withObjectType

type: boolean default: false

Generates validation schema with GraphQL type objects. But excludes Query, Mutation, Subscription objects.

It is currently added for the purpose of using simple objects. See also #20, #107.

This option currently does not support fragment generation. If you are interested, send me PR would be greatly appreciated!

validationSchemaExportType

type: ValidationSchemaExportType default: 'function'

Specify validation schema export type.

useEnumTypeAsDefaultValue

type: boolean default: false

Uses the full path of the enum type as the default value instead of the stringified value.

namingConvention

type: NamingConventionMap default: { enumValues: "change-case-all#pascalCase" }

Uses the full path of the enum type as the default value instead of the stringified value.

Related: https://the-guild.dev/graphql/codegen/docs/config-reference/naming-convention#namingconvention

withOperationVariables

type: boolean default: false

Generates validation schemas for GraphQL operation variables (query, mutation, subscription parameters).

generates:
path/to/file.ts:
plugins:
- typescript
- typescript-operations
- graphql-codegen-validation-schemaconfig:
schema: zodwithOperationVariables: true

When enabled, the plugin will generate validation schemas for each named GraphQL operation's variables. For example, given this query:

queryEditor_StoryQuery($storyId: UUID!) {
story(id: $storyId) {
idtitle
}
}

It will generate:

exportfunctionEditor_StoryQueryVariableSchema(): z.ZodObject<Properties<Editor_StoryQueryQueryVariables>>{returnz.object({storyId: z.string()});}

The generated schemas properly handle:

  • Required vs optional variables
  • Default values
  • References to existing input type schemas
  • All GraphQL scalar types
  • Enum types
  • Array types

operationVariablesSchemaSuffix

type: string default: 'VariableSchema'

Suffix for operation variable schema names when withOperationVariables is enabled.

generates:
path/to/file.ts:
plugins:
- typescript-operations
- graphql-codegen-validation-schemaconfig:
schema: zodwithOperationVariables: trueoperationVariablesSchemaSuffix: VarsSchema

This will generate schema names like Editor_StoryQueryVarsSchema instead of Editor_StoryQueryVariableSchema.

directives

type: DirectiveConfig

Generates validation schema with more API based on directive schema. For example, yaml config and GraphQL schema is here.

inputExampleInput {
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-schemaconfig:
schema: yupdirectives:
# Write directives like## directive:# arg1: schemaApi# arg2: ["schemaApi2", "Hello $1"]## See more examples in `./tests/directive.spec.ts`# https://github.com/Code-Hex/graphql-codegen-typescript-validation-schema/blob/main/tests/directive.spec.tsrequired:
msg: requiredconstraint:
minLength: min# Replace $1 with specified `startsWith` argument value of the constraint directivestartsWith: [matches, /^$1/]format:
# This example means `validation-schema: directive-arg`# directive-arg is supported String and Enum.email: email

Then generates yup validation schema like below.

exportfunctionExampleInputSchema(): yup.SchemaOf<ExampleInput>{returnyup.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-schemaconfig:
schema: zoddirectives:
# Write directives like## directive:# arg1: schemaApi# arg2: ["schemaApi2", "Hello $1"]## See more examples in `./tests/directive.spec.ts`# https://github.com/Code-Hex/graphql-codegen-typescript-validation-schema/blob/main/tests/directive.spec.tsconstraint:
minLength: min# Replace $1 with specified `startsWith` argument value of the constraint directivestartsWith: [regex, /^$1/, message]format:
# This example means `validation-schema: directive-arg`# directive-arg is supported String and Enum.email: email

Then generates zod validation schema like below.

exportfunctionExampleInputSchema(): z.ZodSchema<ExampleInput>{returnz.object({email: z.string().min(50).email(),message: z.string().regex(/^Hello/,'message')});}

other schema

Please see example directory.

Operation Variables Validation

This plugin supports generating validation schemas for GraphQL operation variables (queries, mutations, subscriptions). This is useful for validating user input before sending GraphQL operations.

Basic Usage

generates:
path/to/types.ts:
plugins:
- typescript
- typescript-operationspath/to/schemas.ts:
plugins:
- graphql-codegen-validation-schemaconfig:
schema: zodimportFrom: ./typeswithOperationVariables: true

Examples

Given these GraphQL operations:

queryGetUser($id: ID!, $includeProfile: Boolean = false) {
user(id: $id) {
idnameprofile@include(if: $includeProfile) {
bio
}
}
}
mutationCreatePost($input: CreatePostInput!) {
createPost(input: $input) {
idtitle
}
}

The plugin will generate validation schemas like:

Zod

exportfunctionGetUserVariableSchema(): z.ZodObject<Properties<GetUserQueryVariables>>{returnz.object({id: z.string(),includeProfile: z.boolean().default(false).optional()});}exportfunctionCreatePostVariableSchema(): z.ZodObject<Properties<CreatePostMutationVariables>>{returnz.object({input: CreatePostInputSchema()});}

Yup

exportfunctionGetUserVariableSchema(): yup.SchemaOf<GetUserQueryVariables>{returnyup.object({id: yup.string().defined(),includeProfile: yup.boolean().default(false).optional()});}exportfunctionCreatePostVariableSchema(): yup.SchemaOf<CreatePostMutationVariables>{returnyup.object({input: CreatePostInputSchema().defined()});}

Features

  • Type Safety: Generated schemas reference the correct TypeScript operation variable types
  • Smart Defaults: Handles GraphQL default values automatically
  • Input Type References: Automatically references existing input type schemas
  • Nullable/Optional Handling: Properly distinguishes between required and optional variables
  • All Validation Libraries: Works with zod, yup, myzod, and valibot
  • Configurable Naming: Customize schema naming with operationVariablesSchemaSuffix

Notes

Their is currently a compatibility issue with the client-preset. A workaround for this is to split the generation into two (one for client-preset and one for typescript-validation-schema).

generates:
path/to/graphql.ts:
plugins:
- typescript-validation-schema/path/to/graphql/:
preset: 'client',plugins:
...

About

GraphQL Code Generator plugin to generate validation schemas

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

graphql-codegen-typescript-validation-schema

Testnpm version

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 # specify to use this pluginconfig:
# You can put the config for typescript plugin here# see: https://www.graphql-code-generator.com/plugins/typescriptstrictScalars: true# Overrides built-in ID scalar to both input and output types as string.# see: https://the-guild.dev/graphql/codegen/plugins/typescript/typescript#scalarsscalars:
ID: string# You can also write the config for this plugin togetherschema: yup # or zod

It is recommended to write scalars config for built-in type ID, as in the yaml example shown above. For more information: #375

You can check example directory if you want to see more complex config example or how is generated some files.

The Q&A for each schema is written in the README in the respective example directory.

Config API Reference

schema

type: ValidationSchema default: 'yup'

Specify generete validation schema you want.

You can specify yup or zod or myzod.

generates:
path/to/graphql.ts:
plugins:
- typescript
- typescript-validation-schemaconfig:
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:
- typescriptpath/to/validation.ts:
plugins:
- typescript-validation-schemaconfig:
importFrom: ./graphql # path for generated ts code

Then the generator generates code with import statement like below.

import{GeneratedInput}from'./graphql';/* generates validation schema here */

schemaNamespacedImportName

type: string

If defined, will use named imports from the specified module (defined in importFrom) rather than individual imports for each type.

generates:
path/to/types.ts:
plugins:
- typescriptpath/to/schemas.ts:
plugins:
- graphql-codegen-validation-schemaconfig:
schema: yupimportFrom: ./path/to/typesschemaNamespacedImportName: types

Then the generator generates code with import statement like below.

import*astypesfrom'./graphql';/* generates validation schema here */

useTypeImports

type: boolean default: false

Will use import type {} rather than import {} when importing generated TypeScript types. This gives compatibility with TypeScript's "importsNotUsedAsValues": "error" option. Should used in conjunction with importFrom option.

typesPrefix

type: string default: (empty)

Prefixes all import types from generated typescript type.

generates:
path/to/graphql.ts:
plugins:
- typescriptpath/to/validation.ts:
plugins:
- typescript-validation-schemaconfig:
typesPrefix: IimportFrom: ./graphql # path for generated ts code

Then the generator generates code with import statement like below.

import{IGeneratedInput}from'./graphql';/* generates validation schema here */

typesSuffix

type: string default: (empty)

Suffixes all import types from generated typescript type.

generates:
path/to/graphql.ts:
plugins:
- typescriptpath/to/validation.ts:
plugins:
- typescript-validation-schemaconfig:
typesSuffix: IimportFrom: ./graphql # path for generated ts code

Then the generator generates code with import statement like below.

import{GeneratedInputI}from'./graphql';/* generates validation schema here */

enumsAsTypes

type: boolean default: false

Generates enum as TypeScript type instead of enum.

notAllowEmptyString

type: boolean default: false

Generates validation string schema as do not allow empty characters by default.

scalarSchemas

type: ScalarSchemas

Extends or overrides validation schema for the built-in scalars and custom GraphQL scalars.

yup schema

config:
schema: yupscalarSchemas:
Date: yup.date()Email: yup.string().email()

zod schema

config:
schema: zodscalarSchemas:
Date: z.date()Email: z.string().email()

defaultScalarTypeSchema

type: string

Fallback scalar type for undefined scalar types in the schema not found in scalarSchemas.

yup schema

config:
schema: yupdefaultScalarSchema: yup.unknown()

zod schema

config:
schema: zoddefaultScalarSchema: z.unknown()

withObjectType

type: boolean default: false

Generates validation schema with GraphQL type objects. But excludes Query, Mutation, Subscription objects.

It is currently added for the purpose of using simple objects. See also #20, #107.

This option currently does not support fragment generation. If you are interested, send me PR would be greatly appreciated!

validationSchemaExportType

type: ValidationSchemaExportType default: 'function'

Specify validation schema export type.

useEnumTypeAsDefaultValue

type: boolean default: false

Uses the full path of the enum type as the default value instead of the stringified value.

namingConvention

type: NamingConventionMap default: { enumValues: "change-case-all#pascalCase" }

Uses the full path of the enum type as the default value instead of the stringified value.

Related: https://the-guild.dev/graphql/codegen/docs/config-reference/naming-convention#namingconvention

withOperationVariables

type: boolean default: false

Generates validation schemas for GraphQL operation variables (query, mutation, subscription parameters).

generates:
path/to/file.ts:
plugins:
- typescript
- typescript-operations
- graphql-codegen-validation-schemaconfig:
schema: zodwithOperationVariables: true

When enabled, the plugin will generate validation schemas for each named GraphQL operation's variables. For example, given this query:

queryEditor_StoryQuery($storyId: UUID!) {
story(id: $storyId) {
idtitle
}
}

It will generate:

exportfunctionEditor_StoryQueryVariableSchema(): z.ZodObject<Properties<Editor_StoryQueryQueryVariables>>{returnz.object({storyId: z.string()});}

The generated schemas properly handle:

  • Required vs optional variables
  • Default values
  • References to existing input type schemas
  • All GraphQL scalar types
  • Enum types
  • Array types

operationVariablesSchemaSuffix

type: string default: 'VariableSchema'

Suffix for operation variable schema names when withOperationVariables is enabled.

generates:
path/to/file.ts:
plugins:
- typescript-operations
- graphql-codegen-validation-schemaconfig:
schema: zodwithOperationVariables: trueoperationVariablesSchemaSuffix: VarsSchema

This will generate schema names like Editor_StoryQueryVarsSchema instead of Editor_StoryQueryVariableSchema.

directives

type: DirectiveConfig

Generates validation schema with more API based on directive schema. For example, yaml config and GraphQL schema is here.

inputExampleInput {
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-schemaconfig:
schema: yupdirectives:
# Write directives like## directive:# arg1: schemaApi# arg2: ["schemaApi2", "Hello $1"]## See more examples in `./tests/directive.spec.ts`# https://github.com/Code-Hex/graphql-codegen-typescript-validation-schema/blob/main/tests/directive.spec.tsrequired:
msg: requiredconstraint:
minLength: min# Replace $1 with specified `startsWith` argument value of the constraint directivestartsWith: [matches, /^$1/]format:
# This example means `validation-schema: directive-arg`# directive-arg is supported String and Enum.email: email

Then generates yup validation schema like below.

exportfunctionExampleInputSchema(): yup.SchemaOf<ExampleInput>{returnyup.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-schemaconfig:
schema: zoddirectives:
# Write directives like## directive:# arg1: schemaApi# arg2: ["schemaApi2", "Hello $1"]## See more examples in `./tests/directive.spec.ts`# https://github.com/Code-Hex/graphql-codegen-typescript-validation-schema/blob/main/tests/directive.spec.tsconstraint:
minLength: min# Replace $1 with specified `startsWith` argument value of the constraint directivestartsWith: [regex, /^$1/, message]format:
# This example means `validation-schema: directive-arg`# directive-arg is supported String and Enum.email: email

Then generates zod validation schema like below.

exportfunctionExampleInputSchema(): z.ZodSchema<ExampleInput>{returnz.object({email: z.string().min(50).email(),message: z.string().regex(/^Hello/,'message')});}

other schema

Please see example directory.

Operation Variables Validation

This plugin supports generating validation schemas for GraphQL operation variables (queries, mutations, subscriptions). This is useful for validating user input before sending GraphQL operations.

Basic Usage

generates:
path/to/types.ts:
plugins:
- typescript
- typescript-operationspath/to/schemas.ts:
plugins:
- graphql-codegen-validation-schemaconfig:
schema: zodimportFrom: ./typeswithOperationVariables: true

Examples

Given these GraphQL operations:

queryGetUser($id: ID!, $includeProfile: Boolean = false) {
user(id: $id) {
idnameprofile@include(if: $includeProfile) {
bio
}
}
}
mutationCreatePost($input: CreatePostInput!) {
createPost(input: $input) {
idtitle
}
}

The plugin will generate validation schemas like:

Zod

exportfunctionGetUserVariableSchema(): z.ZodObject<Properties<GetUserQueryVariables>>{returnz.object({id: z.string(),includeProfile: z.boolean().default(false).optional()});}exportfunctionCreatePostVariableSchema(): z.ZodObject<Properties<CreatePostMutationVariables>>{returnz.object({input: CreatePostInputSchema()});}

Yup

exportfunctionGetUserVariableSchema(): yup.SchemaOf<GetUserQueryVariables>{returnyup.object({id: yup.string().defined(),includeProfile: yup.boolean().default(false).optional()});}exportfunctionCreatePostVariableSchema(): yup.SchemaOf<CreatePostMutationVariables>{returnyup.object({input: CreatePostInputSchema().defined()});}

Features

  • Type Safety: Generated schemas reference the correct TypeScript operation variable types
  • Smart Defaults: Handles GraphQL default values automatically
  • Input Type References: Automatically references existing input type schemas
  • Nullable/Optional Handling: Properly distinguishes between required and optional variables
  • All Validation Libraries: Works with zod, yup, myzod, and valibot
  • Configurable Naming: Customize schema naming with operationVariablesSchemaSuffix

Notes

Their is currently a compatibility issue with the client-preset. A workaround for this is to split the generation into two (one for client-preset and one for typescript-validation-schema).

generates:
path/to/graphql.ts:
plugins:
- typescript-validation-schema/path/to/graphql/:
preset: 'client',plugins:
...

About

GraphQL Code Generator plugin to generate validation schemas

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

graphql-codegen-typescript-validation-schema

Testnpm version

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 # specify to use this pluginconfig:
# You can put the config for typescript plugin here# see: https://www.graphql-code-generator.com/plugins/typescriptstrictScalars: true# Overrides built-in ID scalar to both input and output types as string.# see: https://the-guild.dev/graphql/codegen/plugins/typescript/typescript#scalarsscalars:
ID: string# You can also write the config for this plugin togetherschema: yup # or zod

It is recommended to write scalars config for built-in type ID, as in the yaml example shown above. For more information: #375

You can check example directory if you want to see more complex config example or how is generated some files.

The Q&A for each schema is written in the README in the respective example directory.

Config API Reference

schema

type: ValidationSchema default: 'yup'

Specify generete validation schema you want.

You can specify yup or zod or myzod.

generates:
path/to/graphql.ts:
plugins:
- typescript
- typescript-validation-schemaconfig:
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:
- typescriptpath/to/validation.ts:
plugins:
- typescript-validation-schemaconfig:
importFrom: ./graphql # path for generated ts code

Then the generator generates code with import statement like below.

import{GeneratedInput}from'./graphql';/* generates validation schema here */

schemaNamespacedImportName

type: string

If defined, will use named imports from the specified module (defined in importFrom) rather than individual imports for each type.

generates:
path/to/types.ts:
plugins:
- typescriptpath/to/schemas.ts:
plugins:
- graphql-codegen-validation-schemaconfig:
schema: yupimportFrom: ./path/to/typesschemaNamespacedImportName: types

Then the generator generates code with import statement like below.

import*astypesfrom'./graphql';/* generates validation schema here */

useTypeImports

type: boolean default: false

Will use import type {} rather than import {} when importing generated TypeScript types. This gives compatibility with TypeScript's "importsNotUsedAsValues": "error" option. Should used in conjunction with importFrom option.

typesPrefix

type: string default: (empty)

Prefixes all import types from generated typescript type.

generates:
path/to/graphql.ts:
plugins:
- typescriptpath/to/validation.ts:
plugins:
- typescript-validation-schemaconfig:
typesPrefix: IimportFrom: ./graphql # path for generated ts code

Then the generator generates code with import statement like below.

import{IGeneratedInput}from'./graphql';/* generates validation schema here */

typesSuffix

type: string default: (empty)

Suffixes all import types from generated typescript type.

generates:
path/to/graphql.ts:
plugins:
- typescriptpath/to/validation.ts:
plugins:
- typescript-validation-schemaconfig:
typesSuffix: IimportFrom: ./graphql # path for generated ts code

Then the generator generates code with import statement like below.

import{GeneratedInputI}from'./graphql';/* generates validation schema here */

enumsAsTypes

type: boolean default: false

Generates enum as TypeScript type instead of enum.

notAllowEmptyString

type: boolean default: false

Generates validation string schema as do not allow empty characters by default.

scalarSchemas

type: ScalarSchemas

Extends or overrides validation schema for the built-in scalars and custom GraphQL scalars.

yup schema

config:
schema: yupscalarSchemas:
Date: yup.date()Email: yup.string().email()

zod schema

config:
schema: zodscalarSchemas:
Date: z.date()Email: z.string().email()

defaultScalarTypeSchema

type: string

Fallback scalar type for undefined scalar types in the schema not found in scalarSchemas.

yup schema

config:
schema: yupdefaultScalarSchema: yup.unknown()

zod schema

config:
schema: zoddefaultScalarSchema: z.unknown()

withObjectType

type: boolean default: false

Generates validation schema with GraphQL type objects. But excludes Query, Mutation, Subscription objects.

It is currently added for the purpose of using simple objects. See also #20, #107.

This option currently does not support fragment generation. If you are interested, send me PR would be greatly appreciated!

validationSchemaExportType

type: ValidationSchemaExportType default: 'function'

Specify validation schema export type.

useEnumTypeAsDefaultValue

type: boolean default: false

Uses the full path of the enum type as the default value instead of the stringified value.

namingConvention

type: NamingConventionMap default: { enumValues: "change-case-all#pascalCase" }

Uses the full path of the enum type as the default value instead of the stringified value.

Related: https://the-guild.dev/graphql/codegen/docs/config-reference/naming-convention#namingconvention

withOperationVariables

type: boolean default: false

Generates validation schemas for GraphQL operation variables (query, mutation, subscription parameters).

generates:
path/to/file.ts:
plugins:
- typescript
- typescript-operations
- graphql-codegen-validation-schemaconfig:
schema: zodwithOperationVariables: true

When enabled, the plugin will generate validation schemas for each named GraphQL operation's variables. For example, given this query:

queryEditor_StoryQuery($storyId: UUID!) {
story(id: $storyId) {
idtitle
}
}

It will generate:

exportfunctionEditor_StoryQueryVariableSchema(): z.ZodObject<Properties<Editor_StoryQueryQueryVariables>>{returnz.object({storyId: z.string()});}

The generated schemas properly handle:

  • Required vs optional variables
  • Default values
  • References to existing input type schemas
  • All GraphQL scalar types
  • Enum types
  • Array types

operationVariablesSchemaSuffix

type: string default: 'VariableSchema'

Suffix for operation variable schema names when withOperationVariables is enabled.

generates:
path/to/file.ts:
plugins:
- typescript-operations
- graphql-codegen-validation-schemaconfig:
schema: zodwithOperationVariables: trueoperationVariablesSchemaSuffix: VarsSchema

This will generate schema names like Editor_StoryQueryVarsSchema instead of Editor_StoryQueryVariableSchema.

directives

type: DirectiveConfig

Generates validation schema with more API based on directive schema. For example, yaml config and GraphQL schema is here.

inputExampleInput {
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-schemaconfig:
schema: yupdirectives:
# Write directives like## directive:# arg1: schemaApi# arg2: ["schemaApi2", "Hello $1"]## See more examples in `./tests/directive.spec.ts`# https://github.com/Code-Hex/graphql-codegen-typescript-validation-schema/blob/main/tests/directive.spec.tsrequired:
msg: requiredconstraint:
minLength: min# Replace $1 with specified `startsWith` argument value of the constraint directivestartsWith: [matches, /^$1/]format:
# This example means `validation-schema: directive-arg`# directive-arg is supported String and Enum.email: email

Then generates yup validation schema like below.

exportfunctionExampleInputSchema(): yup.SchemaOf<ExampleInput>{returnyup.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-schemaconfig:
schema: zoddirectives:
# Write directives like## directive:# arg1: schemaApi# arg2: ["schemaApi2", "Hello $1"]## See more examples in `./tests/directive.spec.ts`# https://github.com/Code-Hex/graphql-codegen-typescript-validation-schema/blob/main/tests/directive.spec.tsconstraint:
minLength: min# Replace $1 with specified `startsWith` argument value of the constraint directivestartsWith: [regex, /^$1/, message]format:
# This example means `validation-schema: directive-arg`# directive-arg is supported String and Enum.email: email

Then generates zod validation schema like below.

exportfunctionExampleInputSchema(): z.ZodSchema<ExampleInput>{returnz.object({email: z.string().min(50).email(),message: z.string().regex(/^Hello/,'message')});}

other schema

Please see example directory.

Operation Variables Validation

This plugin supports generating validation schemas for GraphQL operation variables (queries, mutations, subscriptions). This is useful for validating user input before sending GraphQL operations.

Basic Usage

generates:
path/to/types.ts:
plugins:
- typescript
- typescript-operationspath/to/schemas.ts:
plugins:
- graphql-codegen-validation-schemaconfig:
schema: zodimportFrom: ./typeswithOperationVariables: true

Examples

Given these GraphQL operations:

queryGetUser($id: ID!, $includeProfile: Boolean = false) {
user(id: $id) {
idnameprofile@include(if: $includeProfile) {
bio
}
}
}
mutationCreatePost($input: CreatePostInput!) {
createPost(input: $input) {
idtitle
}
}

The plugin will generate validation schemas like:

Zod

exportfunctionGetUserVariableSchema(): z.ZodObject<Properties<GetUserQueryVariables>>{returnz.object({id: z.string(),includeProfile: z.boolean().default(false).optional()});}exportfunctionCreatePostVariableSchema(): z.ZodObject<Properties<CreatePostMutationVariables>>{returnz.object({input: CreatePostInputSchema()});}

Yup

exportfunctionGetUserVariableSchema(): yup.SchemaOf<GetUserQueryVariables>{returnyup.object({id: yup.string().defined(),includeProfile: yup.boolean().default(false).optional()});}exportfunctionCreatePostVariableSchema(): yup.SchemaOf<CreatePostMutationVariables>{returnyup.object({input: CreatePostInputSchema().defined()});}

Features

  • Type Safety: Generated schemas reference the correct TypeScript operation variable types
  • Smart Defaults: Handles GraphQL default values automatically
  • Input Type References: Automatically references existing input type schemas
  • Nullable/Optional Handling: Properly distinguishes between required and optional variables
  • All Validation Libraries: Works with zod, yup, myzod, and valibot
  • Configurable Naming: Customize schema naming with operationVariablesSchemaSuffix

Notes

Their is currently a compatibility issue with the client-preset. A workaround for this is to split the generation into two (one for client-preset and one for typescript-validation-schema).

generates:
path/to/graphql.ts:
plugins:
- typescript-validation-schema/path/to/graphql/:
preset: 'client',plugins:
...

About

GraphQL Code Generator plugin to generate validation schemas

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

graphql-codegen-typescript-validation-schema

Testnpm version

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 # specify to use this pluginconfig:
# You can put the config for typescript plugin here# see: https://www.graphql-code-generator.com/plugins/typescriptstrictScalars: true# Overrides built-in ID scalar to both input and output types as string.# see: https://the-guild.dev/graphql/codegen/plugins/typescript/typescript#scalarsscalars:
ID: string# You can also write the config for this plugin togetherschema: yup # or zod

It is recommended to write scalars config for built-in type ID, as in the yaml example shown above. For more information: #375

You can check example directory if you want to see more complex config example or how is generated some files.

The Q&A for each schema is written in the README in the respective example directory.

Config API Reference

schema

type: ValidationSchema default: 'yup'

Specify generete validation schema you want.

You can specify yup or zod or myzod.

generates:
path/to/graphql.ts:
plugins:
- typescript
- typescript-validation-schemaconfig:
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:
- typescriptpath/to/validation.ts:
plugins:
- typescript-validation-schemaconfig:
importFrom: ./graphql # path for generated ts code

Then the generator generates code with import statement like below.

import{GeneratedInput}from'./graphql';/* generates validation schema here */

schemaNamespacedImportName

type: string

If defined, will use named imports from the specified module (defined in importFrom) rather than individual imports for each type.

generates:
path/to/types.ts:
plugins:
- typescriptpath/to/schemas.ts:
plugins:
- graphql-codegen-validation-schemaconfig:
schema: yupimportFrom: ./path/to/typesschemaNamespacedImportName: types

Then the generator generates code with import statement like below.

import*astypesfrom'./graphql';/* generates validation schema here */

useTypeImports

type: boolean default: false

Will use import type {} rather than import {} when importing generated TypeScript types. This gives compatibility with TypeScript's "importsNotUsedAsValues": "error" option. Should used in conjunction with importFrom option.

typesPrefix

type: string default: (empty)

Prefixes all import types from generated typescript type.

generates:
path/to/graphql.ts:
plugins:
- typescriptpath/to/validation.ts:
plugins:
- typescript-validation-schemaconfig:
typesPrefix: IimportFrom: ./graphql # path for generated ts code

Then the generator generates code with import statement like below.

import{IGeneratedInput}from'./graphql';/* generates validation schema here */

typesSuffix

type: string default: (empty)

Suffixes all import types from generated typescript type.

generates:
path/to/graphql.ts:
plugins:
- typescriptpath/to/validation.ts:
plugins:
- typescript-validation-schemaconfig:
typesSuffix: IimportFrom: ./graphql # path for generated ts code

Then the generator generates code with import statement like below.

import{GeneratedInputI}from'./graphql';/* generates validation schema here */

enumsAsTypes

type: boolean default: false

Generates enum as TypeScript type instead of enum.

notAllowEmptyString

type: boolean default: false

Generates validation string schema as do not allow empty characters by default.

scalarSchemas

type: ScalarSchemas

Extends or overrides validation schema for the built-in scalars and custom GraphQL scalars.

yup schema

config:
schema: yupscalarSchemas:
Date: yup.date()Email: yup.string().email()

zod schema

config:
schema: zodscalarSchemas:
Date: z.date()Email: z.string().email()

defaultScalarTypeSchema

type: string

Fallback scalar type for undefined scalar types in the schema not found in scalarSchemas.

yup schema

config:
schema: yupdefaultScalarSchema: yup.unknown()

zod schema

config:
schema: zoddefaultScalarSchema: z.unknown()

withObjectType

type: boolean default: false

Generates validation schema with GraphQL type objects. But excludes Query, Mutation, Subscription objects.

It is currently added for the purpose of using simple objects. See also #20, #107.

This option currently does not support fragment generation. If you are interested, send me PR would be greatly appreciated!

validationSchemaExportType

type: ValidationSchemaExportType default: 'function'

Specify validation schema export type.

useEnumTypeAsDefaultValue

type: boolean default: false

Uses the full path of the enum type as the default value instead of the stringified value.

namingConvention

type: NamingConventionMap default: { enumValues: "change-case-all#pascalCase" }

Uses the full path of the enum type as the default value instead of the stringified value.

Related: https://the-guild.dev/graphql/codegen/docs/config-reference/naming-convention#namingconvention

withOperationVariables

type: boolean default: false

Generates validation schemas for GraphQL operation variables (query, mutation, subscription parameters).

generates:
path/to/file.ts:
plugins:
- typescript
- typescript-operations
- graphql-codegen-validation-schemaconfig:
schema: zodwithOperationVariables: true

When enabled, the plugin will generate validation schemas for each named GraphQL operation's variables. For example, given this query:

queryEditor_StoryQuery($storyId: UUID!) {
story(id: $storyId) {
idtitle
}
}

It will generate:

exportfunctionEditor_StoryQueryVariableSchema(): z.ZodObject<Properties<Editor_StoryQueryQueryVariables>>{returnz.object({storyId: z.string()});}

The generated schemas properly handle:

  • Required vs optional variables
  • Default values
  • References to existing input type schemas
  • All GraphQL scalar types
  • Enum types
  • Array types

operationVariablesSchemaSuffix

type: string default: 'VariableSchema'

Suffix for operation variable schema names when withOperationVariables is enabled.

generates:
path/to/file.ts:
plugins:
- typescript-operations
- graphql-codegen-validation-schemaconfig:
schema: zodwithOperationVariables: trueoperationVariablesSchemaSuffix: VarsSchema

This will generate schema names like Editor_StoryQueryVarsSchema instead of Editor_StoryQueryVariableSchema.

directives

type: DirectiveConfig

Generates validation schema with more API based on directive schema. For example, yaml config and GraphQL schema is here.

inputExampleInput {
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-schemaconfig:
schema: yupdirectives:
# Write directives like## directive:# arg1: schemaApi# arg2: ["schemaApi2", "Hello $1"]## See more examples in `./tests/directive.spec.ts`# https://github.com/Code-Hex/graphql-codegen-typescript-validation-schema/blob/main/tests/directive.spec.tsrequired:
msg: requiredconstraint:
minLength: min# Replace $1 with specified `startsWith` argument value of the constraint directivestartsWith: [matches, /^$1/]format:
# This example means `validation-schema: directive-arg`# directive-arg is supported String and Enum.email: email

Then generates yup validation schema like below.

exportfunctionExampleInputSchema(): yup.SchemaOf<ExampleInput>{returnyup.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-schemaconfig:
schema: zoddirectives:
# Write directives like## directive:# arg1: schemaApi# arg2: ["schemaApi2", "Hello $1"]## See more examples in `./tests/directive.spec.ts`# https://github.com/Code-Hex/graphql-codegen-typescript-validation-schema/blob/main/tests/directive.spec.tsconstraint:
minLength: min# Replace $1 with specified `startsWith` argument value of the constraint directivestartsWith: [regex, /^$1/, message]format:
# This example means `validation-schema: directive-arg`# directive-arg is supported String and Enum.email: email

Then generates zod validation schema like below.

exportfunctionExampleInputSchema(): z.ZodSchema<ExampleInput>{returnz.object({email: z.string().min(50).email(),message: z.string().regex(/^Hello/,'message')});}

other schema

Please see example directory.

Operation Variables Validation

This plugin supports generating validation schemas for GraphQL operation variables (queries, mutations, subscriptions). This is useful for validating user input before sending GraphQL operations.

Basic Usage

generates:
path/to/types.ts:
plugins:
- typescript
- typescript-operationspath/to/schemas.ts:
plugins:
- graphql-codegen-validation-schemaconfig:
schema: zodimportFrom: ./typeswithOperationVariables: true

Examples

Given these GraphQL operations:

queryGetUser($id: ID!, $includeProfile: Boolean = false) {
user(id: $id) {
idnameprofile@include(if: $includeProfile) {
bio
}
}
}
mutationCreatePost($input: CreatePostInput!) {
createPost(input: $input) {
idtitle
}
}

The plugin will generate validation schemas like:

Zod

exportfunctionGetUserVariableSchema(): z.ZodObject<Properties<GetUserQueryVariables>>{returnz.object({id: z.string(),includeProfile: z.boolean().default(false).optional()});}exportfunctionCreatePostVariableSchema(): z.ZodObject<Properties<CreatePostMutationVariables>>{returnz.object({input: CreatePostInputSchema()});}

Yup

exportfunctionGetUserVariableSchema(): yup.SchemaOf<GetUserQueryVariables>{returnyup.object({id: yup.string().defined(),includeProfile: yup.boolean().default(false).optional()});}exportfunctionCreatePostVariableSchema(): yup.SchemaOf<CreatePostMutationVariables>{returnyup.object({input: CreatePostInputSchema().defined()});}

Features

  • Type Safety: Generated schemas reference the correct TypeScript operation variable types
  • Smart Defaults: Handles GraphQL default values automatically
  • Input Type References: Automatically references existing input type schemas
  • Nullable/Optional Handling: Properly distinguishes between required and optional variables
  • All Validation Libraries: Works with zod, yup, myzod, and valibot
  • Configurable Naming: Customize schema naming with operationVariablesSchemaSuffix

Notes

Their is currently a compatibility issue with the client-preset. A workaround for this is to split the generation into two (one for client-preset and one for typescript-validation-schema).

generates:
path/to/graphql.ts:
plugins:
- typescript-validation-schema/path/to/graphql/:
preset: 'client',plugins:
...

About

GraphQL Code Generator plugin to generate validation schemas

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

graphql-codegen-typescript-validation-schema

Testnpm version

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 # specify to use this pluginconfig:
# You can put the config for typescript plugin here# see: https://www.graphql-code-generator.com/plugins/typescriptstrictScalars: true# Overrides built-in ID scalar to both input and output types as string.# see: https://the-guild.dev/graphql/codegen/plugins/typescript/typescript#scalarsscalars:
ID: string# You can also write the config for this plugin togetherschema: yup # or zod

It is recommended to write scalars config for built-in type ID, as in the yaml example shown above. For more information: #375

You can check example directory if you want to see more complex config example or how is generated some files.

The Q&A for each schema is written in the README in the respective example directory.

Config API Reference

schema

type: ValidationSchema default: 'yup'

Specify generete validation schema you want.

You can specify yup or zod or myzod.

generates:
path/to/graphql.ts:
plugins:
- typescript
- typescript-validation-schemaconfig:
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:
- typescriptpath/to/validation.ts:
plugins:
- typescript-validation-schemaconfig:
importFrom: ./graphql # path for generated ts code

Then the generator generates code with import statement like below.

import{GeneratedInput}from'./graphql';/* generates validation schema here */

schemaNamespacedImportName

type: string

If defined, will use named imports from the specified module (defined in importFrom) rather than individual imports for each type.

generates:
path/to/types.ts:
plugins:
- typescriptpath/to/schemas.ts:
plugins:
- graphql-codegen-validation-schemaconfig:
schema: yupimportFrom: ./path/to/typesschemaNamespacedImportName: types

Then the generator generates code with import statement like below.

import*astypesfrom'./graphql';/* generates validation schema here */

useTypeImports

type: boolean default: false

Will use import type {} rather than import {} when importing generated TypeScript types. This gives compatibility with TypeScript's "importsNotUsedAsValues": "error" option. Should used in conjunction with importFrom option.

typesPrefix

type: string default: (empty)

Prefixes all import types from generated typescript type.

generates:
path/to/graphql.ts:
plugins:
- typescriptpath/to/validation.ts:
plugins:
- typescript-validation-schemaconfig:
typesPrefix: IimportFrom: ./graphql # path for generated ts code

Then the generator generates code with import statement like below.

import{IGeneratedInput}from'./graphql';/* generates validation schema here */

typesSuffix

type: string default: (empty)

Suffixes all import types from generated typescript type.

generates:
path/to/graphql.ts:
plugins:
- typescriptpath/to/validation.ts:
plugins:
- typescript-validation-schemaconfig:
typesSuffix: IimportFrom: ./graphql # path for generated ts code

Then the generator generates code with import statement like below.

import{GeneratedInputI}from'./graphql';/* generates validation schema here */

enumsAsTypes

type: boolean default: false

Generates enum as TypeScript type instead of enum.

notAllowEmptyString

type: boolean default: false

Generates validation string schema as do not allow empty characters by default.

scalarSchemas

type: ScalarSchemas

Extends or overrides validation schema for the built-in scalars and custom GraphQL scalars.

yup schema

config:
schema: yupscalarSchemas:
Date: yup.date()Email: yup.string().email()

zod schema

config:
schema: zodscalarSchemas:
Date: z.date()Email: z.string().email()

defaultScalarTypeSchema

type: string

Fallback scalar type for undefined scalar types in the schema not found in scalarSchemas.

yup schema

config:
schema: yupdefaultScalarSchema: yup.unknown()

zod schema

config:
schema: zoddefaultScalarSchema: z.unknown()

withObjectType

type: boolean default: false

Generates validation schema with GraphQL type objects. But excludes Query, Mutation, Subscription objects.

It is currently added for the purpose of using simple objects. See also #20, #107.

This option currently does not support fragment generation. If you are interested, send me PR would be greatly appreciated!

validationSchemaExportType

type: ValidationSchemaExportType default: 'function'

Specify validation schema export type.

useEnumTypeAsDefaultValue

type: boolean default: false

Uses the full path of the enum type as the default value instead of the stringified value.

namingConvention

type: NamingConventionMap default: { enumValues: "change-case-all#pascalCase" }

Uses the full path of the enum type as the default value instead of the stringified value.

Related: https://the-guild.dev/graphql/codegen/docs/config-reference/naming-convention#namingconvention

withOperationVariables

type: boolean default: false

Generates validation schemas for GraphQL operation variables (query, mutation, subscription parameters).

generates:
path/to/file.ts:
plugins:
- typescript
- typescript-operations
- graphql-codegen-validation-schemaconfig:
schema: zodwithOperationVariables: true

When enabled, the plugin will generate validation schemas for each named GraphQL operation's variables. For example, given this query:

queryEditor_StoryQuery($storyId: UUID!) {
story(id: $storyId) {
idtitle
}
}

It will generate:

exportfunctionEditor_StoryQueryVariableSchema(): z.ZodObject<Properties<Editor_StoryQueryQueryVariables>>{returnz.object({storyId: z.string()});}

The generated schemas properly handle:

  • Required vs optional variables
  • Default values
  • References to existing input type schemas
  • All GraphQL scalar types
  • Enum types
  • Array types

operationVariablesSchemaSuffix

type: string default: 'VariableSchema'

Suffix for operation variable schema names when withOperationVariables is enabled.

generates:
path/to/file.ts:
plugins:
- typescript-operations
- graphql-codegen-validation-schemaconfig:
schema: zodwithOperationVariables: trueoperationVariablesSchemaSuffix: VarsSchema

This will generate schema names like Editor_StoryQueryVarsSchema instead of Editor_StoryQueryVariableSchema.

directives

type: DirectiveConfig

Generates validation schema with more API based on directive schema. For example, yaml config and GraphQL schema is here.

inputExampleInput {
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-schemaconfig:
schema: yupdirectives:
# Write directives like## directive:# arg1: schemaApi# arg2: ["schemaApi2", "Hello $1"]## See more examples in `./tests/directive.spec.ts`# https://github.com/Code-Hex/graphql-codegen-typescript-validation-schema/blob/main/tests/directive.spec.tsrequired:
msg: requiredconstraint:
minLength: min# Replace $1 with specified `startsWith` argument value of the constraint directivestartsWith: [matches, /^$1/]format:
# This example means `validation-schema: directive-arg`# directive-arg is supported String and Enum.email: email

Then generates yup validation schema like below.

exportfunctionExampleInputSchema(): yup.SchemaOf<ExampleInput>{returnyup.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-schemaconfig:
schema: zoddirectives:
# Write directives like## directive:# arg1: schemaApi# arg2: ["schemaApi2", "Hello $1"]## See more examples in `./tests/directive.spec.ts`# https://github.com/Code-Hex/graphql-codegen-typescript-validation-schema/blob/main/tests/directive.spec.tsconstraint:
minLength: min# Replace $1 with specified `startsWith` argument value of the constraint directivestartsWith: [regex, /^$1/, message]format:
# This example means `validation-schema: directive-arg`# directive-arg is supported String and Enum.email: email

Then generates zod validation schema like below.

exportfunctionExampleInputSchema(): z.ZodSchema<ExampleInput>{returnz.object({email: z.string().min(50).email(),message: z.string().regex(/^Hello/,'message')});}

other schema

Please see example directory.

Operation Variables Validation

This plugin supports generating validation schemas for GraphQL operation variables (queries, mutations, subscriptions). This is useful for validating user input before sending GraphQL operations.

Basic Usage

generates:
path/to/types.ts:
plugins:
- typescript
- typescript-operationspath/to/schemas.ts:
plugins:
- graphql-codegen-validation-schemaconfig:
schema: zodimportFrom: ./typeswithOperationVariables: true

Examples

Given these GraphQL operations:

queryGetUser($id: ID!, $includeProfile: Boolean = false) {
user(id: $id) {
idnameprofile@include(if: $includeProfile) {
bio
}
}
}
mutationCreatePost($input: CreatePostInput!) {
createPost(input: $input) {
idtitle
}
}

The plugin will generate validation schemas like:

Zod

exportfunctionGetUserVariableSchema(): z.ZodObject<Properties<GetUserQueryVariables>>{returnz.object({id: z.string(),includeProfile: z.boolean().default(false).optional()});}exportfunctionCreatePostVariableSchema(): z.ZodObject<Properties<CreatePostMutationVariables>>{returnz.object({input: CreatePostInputSchema()});}

Yup

exportfunctionGetUserVariableSchema(): yup.SchemaOf<GetUserQueryVariables>{returnyup.object({id: yup.string().defined(),includeProfile: yup.boolean().default(false).optional()});}exportfunctionCreatePostVariableSchema(): yup.SchemaOf<CreatePostMutationVariables>{returnyup.object({input: CreatePostInputSchema().defined()});}

Features

  • Type Safety: Generated schemas reference the correct TypeScript operation variable types
  • Smart Defaults: Handles GraphQL default values automatically
  • Input Type References: Automatically references existing input type schemas
  • Nullable/Optional Handling: Properly distinguishes between required and optional variables
  • All Validation Libraries: Works with zod, yup, myzod, and valibot
  • Configurable Naming: Customize schema naming with operationVariablesSchemaSuffix

Notes

Their is currently a compatibility issue with the client-preset. A workaround for this is to split the generation into two (one for client-preset and one for typescript-validation-schema).

generates:
path/to/graphql.ts:
plugins:
- typescript-validation-schema/path/to/graphql/:
preset: 'client',plugins:
...

About

GraphQL Code Generator plugin to generate validation schemas

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

graphql-codegen-typescript-validation-schema

Testnpm version

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 # specify to use this pluginconfig:
# You can put the config for typescript plugin here# see: https://www.graphql-code-generator.com/plugins/typescriptstrictScalars: true# Overrides built-in ID scalar to both input and output types as string.# see: https://the-guild.dev/graphql/codegen/plugins/typescript/typescript#scalarsscalars:
ID: string# You can also write the config for this plugin togetherschema: yup # or zod

It is recommended to write scalars config for built-in type ID, as in the yaml example shown above. For more information: #375

You can check example directory if you want to see more complex config example or how is generated some files.

The Q&A for each schema is written in the README in the respective example directory.

Config API Reference

schema

type: ValidationSchema default: 'yup'

Specify generete validation schema you want.

You can specify yup or zod or myzod.

generates:
path/to/graphql.ts:
plugins:
- typescript
- typescript-validation-schemaconfig:
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:
- typescriptpath/to/validation.ts:
plugins:
- typescript-validation-schemaconfig:
importFrom: ./graphql # path for generated ts code

Then the generator generates code with import statement like below.

import{GeneratedInput}from'./graphql';/* generates validation schema here */

schemaNamespacedImportName

type: string

If defined, will use named imports from the specified module (defined in importFrom) rather than individual imports for each type.

generates:
path/to/types.ts:
plugins:
- typescriptpath/to/schemas.ts:
plugins:
- graphql-codegen-validation-schemaconfig:
schema: yupimportFrom: ./path/to/typesschemaNamespacedImportName: types

Then the generator generates code with import statement like below.

import*astypesfrom'./graphql';/* generates validation schema here */

useTypeImports

type: boolean default: false

Will use import type {} rather than import {} when importing generated TypeScript types. This gives compatibility with TypeScript's "importsNotUsedAsValues": "error" option. Should used in conjunction with importFrom option.

typesPrefix

type: string default: (empty)

Prefixes all import types from generated typescript type.

generates:
path/to/graphql.ts:
plugins:
- typescriptpath/to/validation.ts:
plugins:
- typescript-validation-schemaconfig:
typesPrefix: IimportFrom: ./graphql # path for generated ts code

Then the generator generates code with import statement like below.

import{IGeneratedInput}from'./graphql';/* generates validation schema here */

typesSuffix

type: string default: (empty)

Suffixes all import types from generated typescript type.

generates:
path/to/graphql.ts:
plugins:
- typescriptpath/to/validation.ts:
plugins:
- typescript-validation-schemaconfig:
typesSuffix: IimportFrom: ./graphql # path for generated ts code

Then the generator generates code with import statement like below.

import{GeneratedInputI}from'./graphql';/* generates validation schema here */

enumsAsTypes

type: boolean default: false

Generates enum as TypeScript type instead of enum.

notAllowEmptyString

type: boolean default: false

Generates validation string schema as do not allow empty characters by default.

scalarSchemas

type: ScalarSchemas

Extends or overrides validation schema for the built-in scalars and custom GraphQL scalars.

yup schema

config:
schema: yupscalarSchemas:
Date: yup.date()Email: yup.string().email()

zod schema

config:
schema: zodscalarSchemas:
Date: z.date()Email: z.string().email()

defaultScalarTypeSchema

type: string

Fallback scalar type for undefined scalar types in the schema not found in scalarSchemas.

yup schema

config:
schema: yupdefaultScalarSchema: yup.unknown()

zod schema

config:
schema: zoddefaultScalarSchema: z.unknown()

withObjectType

type: boolean default: false

Generates validation schema with GraphQL type objects. But excludes Query, Mutation, Subscription objects.

It is currently added for the purpose of using simple objects. See also #20, #107.

This option currently does not support fragment generation. If you are interested, send me PR would be greatly appreciated!

validationSchemaExportType

type: ValidationSchemaExportType default: 'function'

Specify validation schema export type.

useEnumTypeAsDefaultValue

type: boolean default: false

Uses the full path of the enum type as the default value instead of the stringified value.

namingConvention

type: NamingConventionMap default: { enumValues: "change-case-all#pascalCase" }

Uses the full path of the enum type as the default value instead of the stringified value.

Related: https://the-guild.dev/graphql/codegen/docs/config-reference/naming-convention#namingconvention

withOperationVariables

type: boolean default: false

Generates validation schemas for GraphQL operation variables (query, mutation, subscription parameters).

generates:
path/to/file.ts:
plugins:
- typescript
- typescript-operations
- graphql-codegen-validation-schemaconfig:
schema: zodwithOperationVariables: true

When enabled, the plugin will generate validation schemas for each named GraphQL operation's variables. For example, given this query:

queryEditor_StoryQuery($storyId: UUID!) {
story(id: $storyId) {
idtitle
}
}

It will generate:

exportfunctionEditor_StoryQueryVariableSchema(): z.ZodObject<Properties<Editor_StoryQueryQueryVariables>>{returnz.object({storyId: z.string()});}

The generated schemas properly handle:

  • Required vs optional variables
  • Default values
  • References to existing input type schemas
  • All GraphQL scalar types
  • Enum types
  • Array types

operationVariablesSchemaSuffix

type: string default: 'VariableSchema'

Suffix for operation variable schema names when withOperationVariables is enabled.

generates:
path/to/file.ts:
plugins:
- typescript-operations
- graphql-codegen-validation-schemaconfig:
schema: zodwithOperationVariables: trueoperationVariablesSchemaSuffix: VarsSchema

This will generate schema names like Editor_StoryQueryVarsSchema instead of Editor_StoryQueryVariableSchema.

directives

type: DirectiveConfig

Generates validation schema with more API based on directive schema. For example, yaml config and GraphQL schema is here.

inputExampleInput {
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-schemaconfig:
schema: yupdirectives:
# Write directives like## directive:# arg1: schemaApi# arg2: ["schemaApi2", "Hello $1"]## See more examples in `./tests/directive.spec.ts`# https://github.com/Code-Hex/graphql-codegen-typescript-validation-schema/blob/main/tests/directive.spec.tsrequired:
msg: requiredconstraint:
minLength: min# Replace $1 with specified `startsWith` argument value of the constraint directivestartsWith: [matches, /^$1/]format:
# This example means `validation-schema: directive-arg`# directive-arg is supported String and Enum.email: email

Then generates yup validation schema like below.

exportfunctionExampleInputSchema(): yup.SchemaOf<ExampleInput>{returnyup.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-schemaconfig:
schema: zoddirectives:
# Write directives like## directive:# arg1: schemaApi# arg2: ["schemaApi2", "Hello $1"]## See more examples in `./tests/directive.spec.ts`# https://github.com/Code-Hex/graphql-codegen-typescript-validation-schema/blob/main/tests/directive.spec.tsconstraint:
minLength: min# Replace $1 with specified `startsWith` argument value of the constraint directivestartsWith: [regex, /^$1/, message]format:
# This example means `validation-schema: directive-arg`# directive-arg is supported String and Enum.email: email

Then generates zod validation schema like below.

exportfunctionExampleInputSchema(): z.ZodSchema<ExampleInput>{returnz.object({email: z.string().min(50).email(),message: z.string().regex(/^Hello/,'message')});}

other schema

Please see example directory.

Operation Variables Validation

This plugin supports generating validation schemas for GraphQL operation variables (queries, mutations, subscriptions). This is useful for validating user input before sending GraphQL operations.

Basic Usage

generates:
path/to/types.ts:
plugins:
- typescript
- typescript-operationspath/to/schemas.ts:
plugins:
- graphql-codegen-validation-schemaconfig:
schema: zodimportFrom: ./typeswithOperationVariables: true

Examples

Given these GraphQL operations:

queryGetUser($id: ID!, $includeProfile: Boolean = false) {
user(id: $id) {
idnameprofile@include(if: $includeProfile) {
bio
}
}
}
mutationCreatePost($input: CreatePostInput!) {
createPost(input: $input) {
idtitle
}
}

The plugin will generate validation schemas like:

Zod

exportfunctionGetUserVariableSchema(): z.ZodObject<Properties<GetUserQueryVariables>>{returnz.object({id: z.string(),includeProfile: z.boolean().default(false).optional()});}exportfunctionCreatePostVariableSchema(): z.ZodObject<Properties<CreatePostMutationVariables>>{returnz.object({input: CreatePostInputSchema()});}

Yup

exportfunctionGetUserVariableSchema(): yup.SchemaOf<GetUserQueryVariables>{returnyup.object({id: yup.string().defined(),includeProfile: yup.boolean().default(false).optional()});}exportfunctionCreatePostVariableSchema(): yup.SchemaOf<CreatePostMutationVariables>{returnyup.object({input: CreatePostInputSchema().defined()});}

Features

  • Type Safety: Generated schemas reference the correct TypeScript operation variable types
  • Smart Defaults: Handles GraphQL default values automatically
  • Input Type References: Automatically references existing input type schemas
  • Nullable/Optional Handling: Properly distinguishes between required and optional variables
  • All Validation Libraries: Works with zod, yup, myzod, and valibot
  • Configurable Naming: Customize schema naming with operationVariablesSchemaSuffix

Notes

Their is currently a compatibility issue with the client-preset. A workaround for this is to split the generation into two (one for client-preset and one for typescript-validation-schema).

generates:
path/to/graphql.ts:
plugins:
- typescript-validation-schema/path/to/graphql/:
preset: 'client',plugins:
...

About

GraphQL Code Generator plugin to generate validation schemas

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages