import { expectType } from 'tsd' import fastify from 'fastify' import { GraphQLDirective, GraphQLResolveInfo } from 'graphql' import { MercuriusContext } from 'mercurius' import mercuriusValidation, { MercuriusValidationHandler, MercuriusValidationHandlerMetadata, MercuriusValidationOptions } from '../..' // Validate GraphQL definitions expectType(mercuriusValidation.graphQLTypeDefs) expectType(mercuriusValidation.graphQLDirective) const app = fastify() // Register without options app.register(mercuriusValidation) app.register(mercuriusValidation, {}) // Register with AJV options app.register(mercuriusValidation, { coerceTypes: false }) // Use different modes app.register(mercuriusValidation, { mode: 'JTD' }) app.register(mercuriusValidation, { mode: 'JSONSchema' }) // Turn directive validation on/off app.register(mercuriusValidation, { directiveValidation: true }) app.register(mercuriusValidation, { directiveValidation: false }) // Register JSON Schema definitions app.register(mercuriusValidation, { mode: 'JSONSchema', schema: { Filters: { text: { minLength: 1 } }, Query: { message: { id: { minLength: 1 } } } } }) // Register JTD definitions app.register(mercuriusValidation, { mode: 'JTD', schema: { Filters: { text: { enum: ['hello', 'there'] } }, Query: { message: { id: { type: 'uint8' } } } } }) // Register Function definitions app.register(mercuriusValidation, { schema: { Query: { message: { async id (metadata, value, parent, args, context, info) { expectType(metadata) expectType(value) expectType(parent) expectType(args) expectType(context) expectType(info) } } } } }) // Using options as object without generics interface CustomParent { parent: Record; } interface CustomArgs { arg: Record; } interface CustomContext extends MercuriusContext { hello?: string; } const validationOptions: MercuriusValidationOptions = { schema: { Query: { message: { async id ( metadata, value, parent: CustomParent, args: CustomArgs, context: CustomContext, info ) { expectType(metadata) expectType(value) expectType(parent) expectType(args) expectType(context) expectType(context?.hello) expectType(info) } } } } } app.register(mercuriusValidation, validationOptions) // Using options as input object with generics const authOptionsWithGenerics: MercuriusValidationOptions = { schema: { Query: { message: { async id (metadata, value, parent, args, context, info) { expectType(metadata) expectType(value) expectType(parent) expectType(args) expectType(context) expectType(context?.hello) expectType(info) } } } } } app.register(mercuriusValidation, authOptionsWithGenerics) // Creating functions using handler types const id: MercuriusValidationHandler<{}, {}, CustomContext> = async (metadata, value, parent, args, context, info) => { expectType(metadata) expectType(value) expectType<{}>(parent) expectType<{}>(args) expectType(context) expectType(info) expectType(context?.hello) } app.register(mercuriusValidation, { schema: { Query: { message: { id } } } })