UNPKG

@pothos/core

Version:

Pothos (formerly GiraphQL) is a plugin based schema builder for creating code-first GraphQL schemas in typescript

61 lines (47 loc) 1.49 kB
import { type FieldKind, outputFieldShapeKey, type PothosOutputFieldConfig, type PothosTypeConfig, type SchemaTypes, } from '../types'; export class FieldRef<Types extends SchemaTypes, T = unknown, Kind extends FieldKind = FieldKind> { kind: FieldKind; fieldName?: string; $inferType!: T; [outputFieldShapeKey]!: T; protected pendingActions: (( config: PothosOutputFieldConfig<Types>, ) => PothosOutputFieldConfig<Types> | undefined)[] = []; private initConfig: ( name: string, typeConfig: PothosTypeConfig, ) => PothosOutputFieldConfig<Types>; private onUseCallbacks = new Set<(config: PothosOutputFieldConfig<Types>) => void>(); constructor( kind: Kind, initConfig: (name: string, typeConfig: PothosTypeConfig) => PothosOutputFieldConfig<Types>, ) { this.kind = kind; this.initConfig = initConfig; } updateConfig( cb: (config: PothosOutputFieldConfig<Types>) => PothosOutputFieldConfig<Types> | undefined, ) { this.pendingActions.push(cb); } getConfig(name: string, typeConfig: PothosTypeConfig): PothosOutputFieldConfig<Types> { const config = this.pendingActions.reduce( (cfg, cb) => cb(cfg) ?? cfg, this.initConfig(name, typeConfig), ); for (const cb of this.onUseCallbacks) { this.onUseCallbacks.delete(cb); cb(config); } return config; } onFirstUse(cb: (config: PothosOutputFieldConfig<Types>) => void) { this.onUseCallbacks.add(cb); } }