With-Input plugin A plugin for creating fields with a single input object. This plugin adds a new t.fieldWithInput
method that allows you to more easily define fields with a single input type without having to
define it separately.
npm pnpm yarn bun
npm install --save @pothos/plugin-with-input
import WithInputPlugin from '@pothos/plugin-with-input' ;
const builder = new SchemaBuilder ({
plugins: [WithInputPlugin],
// optional
withInput: {
typeOptions: {
// default options for Input object types created by this plugin
},
argOptions: {
// set required: false to override default behavior
},
},
});
builder. queryType ({
fields : ( t ) => ({
example: t. fieldWithInput ({
input: {
// Note that this uses a new t.input field builder for defining input fields
id: t.input. id ({ required: true }),
},
type: 'ID' ,
resolve : ( root , args ) => args.input.id,
}),
}),
});
This will produce a schema like:
type Query {
example ( input : QueryExampleInput ! ): ID !
}
input QueryExampleInput {
id : ID !
}
The input name will default to ${ParentType.name}${Field.name}Input
.
You can customize the name of your Input object, and the name of the input argument:
builder. queryType ({
fields : ( t ) => ({
example: t. fieldWithInput ({
typeOptions: {
name: 'CustomInputTypeName' ,
// Additional options for the input type can be added here
},
argOptions: {
name: 'customArgName' ,
// Additional options for the input argument can be added here
},
input: {
id: t.input. id ({ required: true }),
},
type: 'ID' ,
// inputs are now under `customArgName`
resolve : ( root , args ) => args.customArgName.id,
}),
}),
});
You can configure the global default for input args when creating the builder by providing
WithInputArgRequired
in the builders SchemaTypes
, and setting withInput.argOptions.required
.
const builder = new SchemaBuilder <{ WithInputArgRequired : false }>({
plugins: [WithInputPlugin],
withInput: {
argOptions: {
required: false ,
},
},
});
arg requiredness can also be set on a per field basis by setting argOptions.required
builder. queryType ({
fields : ( t ) => ({
example: t. fieldWithInput ({
type: 'Boolean' ,
nullable: true ,
argOptions: {
required: false ,
},
input: {
someInput: t.input. boolean ({}),
},
resolve : ( root , args ) => {
return args.input?.someInput;
},
}),
});
If you are using the prisma plugin you can use t.prismaFieldWithInput
to add prisma fields with
input objects:
builder. queryField ( 'user' , ( t ) =>
t. prismaFieldWithInput ({
type: 'User' ,
input: {
id: t.input. id ({ required: true }),
},
nullable: true ,
resolve : ( query , _ , args ) =>
prisma.user. findUnique ({
where: {
id: Number. parseInt (args.input.id, 10 ),
},
... query,
}),
}),
);
If you want to customize how the default input type names are generated you can provide a name
callback in withInput.typeOptions
:
import WithInputPlugin from '@pothos/plugin-with-input' ;
const builder = new SchemaBuilder ({
plugins: [WithInputPlugin],
withInput: {
typeOptions: {
name : ({ parentTypeName , fieldName }) => {
const capitalizedFieldName = `${ fieldName [ 0 ]. toUpperCase () }${ fieldName . slice ( 1 ) }` ;
// This will remove the default Query/Mutation prefix from the input type name
if (parentTypeName === 'Query' || parentTypeName === 'Mutation' ) {
return `${ capitalizedFieldName }Input` ;
}
return `${ parentTypeName }${ capitalizedFieldName }Input` ;
},
},
},
});