nexus
Version:
Scalable, strongly typed GraphQL schema development
36 lines (31 loc) • 1.31 kB
text/typescript
import type { SchemaBuilder } from './builder'
import type { OutputDefinitionBlock } from './definitions/definitionBlocks'
import { NexusTypes, withNexusSymbol } from './definitions/_types'
import type { BaseExtensionConfig } from './dynamicMethod'
export type OutputPropertyFactoryConfig<T> = {
stage: 'walk' | 'build'
builder: SchemaBuilder
typeDef: OutputDefinitionBlock<any>
/** The name of the type this field is being declared on */
typeName: string
}
export interface DynamicOutputPropertyConfig<T extends string> extends BaseExtensionConfig<T> {
/** Invoked when the property is accessed (as a getter) */
factory(config: OutputPropertyFactoryConfig<T>): any
}
export class DynamicOutputPropertyDef<Name extends string> {
constructor(readonly name: Name, protected config: DynamicOutputPropertyConfig<Name>) {}
get value() {
return this.config
}
}
withNexusSymbol(DynamicOutputPropertyDef, NexusTypes.DynamicOutputProperty)
/**
* Defines a new property on the object definition block for an output type, making it possible to build
* custom DSL's on top of Nexus, e.g. in nexus-prisma
*
* T.model.posts()
*/
export function dynamicOutputProperty<T extends string>(config: DynamicOutputPropertyConfig<T>) {
return new DynamicOutputPropertyDef(config.name, config)
}