import { inputFieldShapeKey, type PothosInputFieldConfig, type PothosTypeConfig, type SchemaTypes, } from '../types'; export class InputFieldRef implements PothosSchemaTypes.InputFieldRef { kind = 'InputObject' as const; fieldName?: string; $inferInput!: T; [inputFieldShapeKey]!: T; protected pendingActions: (( config: PothosInputFieldConfig, ) => PothosInputFieldConfig | undefined)[] = []; private initConfig: (name: string, typeConfig: PothosTypeConfig) => PothosInputFieldConfig; private onUseCallbacks = new Set<(config: PothosInputFieldConfig) => void>(); constructor( initConfig: (name: string, typeConfig: PothosTypeConfig) => PothosInputFieldConfig, ) { this.initConfig = initConfig; } updateConfig( cb: (config: PothosInputFieldConfig) => PothosInputFieldConfig | undefined, ) { this.pendingActions.push(cb); } getConfig(name: string, typeConfig: PothosTypeConfig): PothosInputFieldConfig { const config = this.pendingActions.reduce( (config, cb) => cb(config) ?? config, this.initConfig(name, typeConfig), ); for (const cb of this.onUseCallbacks) { this.onUseCallbacks.delete(cb); cb(config); } return config; } onFirstUse(cb: (config: PothosInputFieldConfig) => void) { this.onUseCallbacks.add(cb); } }