@pothos/core
Version:
Pothos (formerly GiraphQL) is a plugin based schema builder for creating code-first GraphQL schemas in typescript
418 lines (395 loc) • 12.7 kB
text/typescript
import type {
CompatibleTypes,
ExposeNullability,
FieldKind,
FieldNullability,
FieldOptionsFromKind,
InferredFieldOptionKeys,
NormalizeArgs,
SchemaTypes,
TypeParam,
} from '../types';
import { RootFieldBuilder } from './root';
export class FieldBuilder<
Types extends SchemaTypes,
ParentShape,
Kind extends FieldKind = FieldKind,
> extends RootFieldBuilder<Types, ParentShape, Kind> {
/**
* Create a Boolean field from a boolean property on the parent object
* @param {string} name - the name of the property on the source object (does not need to match the field name).
* @param {object} [options={}] - Options for this field
*/
exposeBoolean<
Name extends CompatibleTypes<Types, ParentShape, 'Boolean', true>,
ResolveReturnShape,
Nullable extends FieldNullability<'Boolean'> = Types['DefaultFieldNullability'],
>(
name: Name,
...args: NormalizeArgs<
[
options: ExposeNullability<Types, 'Boolean', ParentShape, Name, Nullable> &
Omit<
FieldOptionsFromKind<
Types,
ParentShape,
'Boolean',
Nullable,
{},
Kind,
ParentShape,
ResolveReturnShape
>,
'nullable' | 'type' | InferredFieldOptionKeys
>,
]
>
) {
const [options = {} as never] = args;
return this.exposeField<'Boolean', Nullable, Name>(name, { ...options, type: 'Boolean' });
}
/**
* Create a Float field from a numeric property on the parent object
* @param {string} name - the name of the property on the source object (does not need to match the field name).
* @param {object} [options={}] - Options for this field
*/
exposeFloat<
Name extends CompatibleTypes<Types, ParentShape, 'Float', true>,
ResolveReturnShape,
Nullable extends FieldNullability<'Float'> = Types['DefaultFieldNullability'],
>(
name: Name,
...args: NormalizeArgs<
[
options: ExposeNullability<Types, 'Float', ParentShape, Name, Nullable> &
Omit<
FieldOptionsFromKind<
Types,
ParentShape,
'Float',
Nullable,
{},
Kind,
ParentShape,
ResolveReturnShape
>,
'nullable' | 'type' | InferredFieldOptionKeys
>,
]
>
) {
const [options = {} as never] = args;
return this.exposeField<'Float', Nullable, Name>(name, { ...options, type: 'Float' });
}
/**
* Create an ID field from a property on the parent object
* @param {string} name - the name of the property on the source object (does not need to match the field name).
* @param {object} [options={}] - Options for this field
*/
exposeID<
Name extends CompatibleTypes<Types, ParentShape, 'ID', true>,
ResolveReturnShape,
Nullable extends FieldNullability<'ID'> = Types['DefaultFieldNullability'],
>(
name: Name,
...args: NormalizeArgs<
[
options: ExposeNullability<Types, 'ID', ParentShape, Name, Nullable> &
Omit<
FieldOptionsFromKind<
Types,
ParentShape,
'ID',
Nullable,
{},
Kind,
ParentShape,
ResolveReturnShape
>,
'nullable' | 'type' | InferredFieldOptionKeys
>,
]
>
) {
const [options = {} as never] = args;
return this.exposeField<'ID', Nullable, Name>(name, { ...options, type: 'ID' });
}
/**
* Create an Int field from a numeric property on the parent object
* @param {string} name - the name of the property on the source object (does not need to match the field name).
* @param {object} [options={}] - Options for this field
*/
exposeInt<
Name extends CompatibleTypes<Types, ParentShape, 'Int', true>,
ResolveReturnShape,
Nullable extends FieldNullability<'Int'> = Types['DefaultFieldNullability'],
>(
name: Name,
...args: NormalizeArgs<
[
options: ExposeNullability<Types, 'Int', ParentShape, Name, Nullable> &
Omit<
FieldOptionsFromKind<
Types,
ParentShape,
'Int',
Nullable,
{},
Kind,
ParentShape,
ResolveReturnShape
>,
'nullable' | 'type' | InferredFieldOptionKeys
>,
]
>
) {
const [options = {} as never] = args;
return this.exposeField<'Int', Nullable, Name>(name, { ...options, type: 'Int' });
}
/**
* Create a String field from a string property on the parent object
* @param {string} name - the name of the property on the source object (does not need to match the field name).
* @param {object} [options={}] - Options for this field
*/
exposeString<
Name extends CompatibleTypes<Types, ParentShape, 'String', true>,
ResolveReturnShape,
Nullable extends FieldNullability<'String'> = Types['DefaultFieldNullability'],
>(
name: Name,
...args: NormalizeArgs<
[
options: ExposeNullability<Types, 'String', ParentShape, Name, Nullable> &
Omit<
FieldOptionsFromKind<
Types,
ParentShape,
'String',
Nullable,
{},
Kind,
ParentShape,
ResolveReturnShape
>,
'nullable' | 'type' | InferredFieldOptionKeys
>,
]
>
) {
const [options = {} as never] = args;
return this.exposeField<'String', Nullable, Name>(name, { ...options, type: 'String' });
}
/**
* Create a Boolean list field from a boolean[] property on the parent object
* @param {string} name - the name of the property on the source object (does not need to match the field name).
* @param {object} [options={}] - Options for this field
*/
exposeBooleanList<
Name extends CompatibleTypes<Types, ParentShape, ['Boolean'], { list: true; items: true }>,
ResolveReturnShape,
Nullable extends FieldNullability<['Boolean']> = Types['DefaultFieldNullability'],
>(
name: Name,
...args: NormalizeArgs<
[
options: ExposeNullability<Types, ['Boolean'], ParentShape, Name, Nullable> &
Omit<
FieldOptionsFromKind<
Types,
ParentShape,
['Boolean'],
Nullable,
{},
Kind,
ParentShape,
ResolveReturnShape
>,
'nullable' | 'type' | InferredFieldOptionKeys
>,
]
>
) {
const [options = {} as never] = args;
return this.exposeField<['Boolean'], Nullable, Name>(name, { ...options, type: ['Boolean'] });
}
/**
* Create a Float list field from a number[] property on the parent object
* @param {string} name - the name of the property on the source object (does not need to match the field name).
* @param {object} [options={}] - Options for this field
*/
exposeFloatList<
Name extends CompatibleTypes<Types, ParentShape, ['Float'], { list: true; items: true }>,
ResolveReturnShape,
Nullable extends FieldNullability<['Float']> = Types['DefaultFieldNullability'],
>(
name: Name,
...args: NormalizeArgs<
[
options: ExposeNullability<Types, ['Float'], ParentShape, Name, Nullable> &
Omit<
FieldOptionsFromKind<
Types,
ParentShape,
['Float'],
Nullable,
{},
Kind,
ParentShape,
ResolveReturnShape
>,
'nullable' | 'type' | InferredFieldOptionKeys
>,
]
>
) {
const [options = {} as never] = args;
return this.exposeField<['Float'], Nullable, Name>(name, { ...options, type: ['Float'] });
}
/**
* Create an ID list field from an id[] property on the parent object
* @param {string} name - the name of the property on the source object (does not need to match the field name).
* @param {object} [options={}] - Options for this field
*/
exposeIDList<
Name extends CompatibleTypes<Types, ParentShape, ['ID'], { list: true; items: true }>,
ResolveReturnShape,
Nullable extends FieldNullability<['ID']> = Types['DefaultFieldNullability'],
>(
name: Name,
...args: NormalizeArgs<
[
options: ExposeNullability<Types, ['ID'], ParentShape, Name, Nullable> &
Omit<
FieldOptionsFromKind<
Types,
ParentShape,
['ID'],
Nullable,
{},
Kind,
ParentShape,
ResolveReturnShape
>,
'nullable' | 'type' | InferredFieldOptionKeys
>,
]
>
) {
const [options = {} as never] = args;
return this.exposeField<['ID'], Nullable, Name>(name, { ...options, type: ['ID'] });
}
/**
* Create a Int list field from a number[] property on the parent object
* @param {string} name - the name of the property on the source object (does not need to match the field name).
* @param {object} [options={}] - Options for this field
*/
exposeIntList<
Name extends CompatibleTypes<Types, ParentShape, ['Int'], { list: true; items: true }>,
ResolveReturnShape,
Nullable extends FieldNullability<['Int']> = Types['DefaultFieldNullability'],
>(
name: Name,
...args: NormalizeArgs<
[
options: ExposeNullability<Types, ['Int'], ParentShape, Name, Nullable> &
Omit<
FieldOptionsFromKind<
Types,
ParentShape,
['Int'],
Nullable,
{},
Kind,
ParentShape,
ResolveReturnShape
>,
'nullable' | 'type' | InferredFieldOptionKeys
>,
]
>
) {
const [options = {} as never] = args;
return this.exposeField<['Int'], Nullable, Name>(name, { ...options, type: ['Int'] });
}
/**
* Create a String list field from a string[] property on the parent object
* @param {string} name - the name of the property on the source object (does not need to match the field name).
* @param {object} [options={}] - Options for this field
*/
exposeStringList<
Name extends CompatibleTypes<Types, ParentShape, ['String'], { list: true; items: true }>,
ResolveReturnShape,
Nullable extends FieldNullability<['String']> = Types['DefaultFieldNullability'],
>(
name: Name,
...args: NormalizeArgs<
[
options: ExposeNullability<Types, ['String'], ParentShape, Name, Nullable> &
Omit<
FieldOptionsFromKind<
Types,
ParentShape,
['String'],
Nullable,
{},
Kind,
ParentShape,
ResolveReturnShape
>,
'nullable' | 'type' | InferredFieldOptionKeys
>,
]
>
) {
const [options = {} as never] = args;
return this.exposeField<['String'], Nullable, Name>(name, { ...options, type: ['String'] });
}
/**
* Create a field that resolves to a property of the corresponding type on the parent object
* @param {string} name - the name of the property on the source object (does not need to match the field name).
* @param {object} [options={}] - Options for this field
*/
expose<
Type extends TypeParam<Types>,
Nullable extends FieldNullability<Type>,
ResolveReturnShape,
Name extends CompatibleTypes<
Types,
ParentShape,
Type,
Type extends [unknown] ? { list: true; items: true } : true
>,
>(
name: Name extends keyof ParentShape ? Name : keyof ParentShape,
...args: NormalizeArgs<
[
options: ExposeNullability<Types, Type, ParentShape, Name, Nullable> &
Omit<
FieldOptionsFromKind<
Types,
ParentShape,
Type,
Nullable,
{},
Kind,
ParentShape,
ResolveReturnShape
>,
'nullable' | InferredFieldOptionKeys
>,
]
>
) {
const [options = {} as never] = args;
return this.exposeField(
name as never as CompatibleTypes<
Types,
ParentShape,
Type,
Type extends [unknown] ? { list: true; items: true } : true
>,
options,
);
}
}