import type { AbstractTypePlanner, BaseGraphQLArguments, GrafastArgumentConfig, GrafastFieldConfig, GrafastFieldConfigArgumentMap, GrafastInputFieldConfig, GrafastInputFieldConfigMap, PlanTypeInfo, Step } from "grafast"; import type { GraphQLArgumentConfig, GraphQLEnumType, GraphQLEnumTypeConfig, GraphQLEnumValueConfig, GraphQLEnumValueConfigMap, GraphQLFieldConfig, GraphQLFieldConfigArgumentMap, GraphQLFieldConfigMap, GraphQLInputFieldConfigMap, GraphQLInputObjectType, GraphQLInputObjectTypeConfig, GraphQLInputType, GraphQLInterfaceType, GraphQLInterfaceTypeConfig, GraphQLNamedType, GraphQLNonNull, GraphQLObjectType, GraphQLObjectTypeConfig, GraphQLOutputType, GraphQLScalarType, GraphQLScalarTypeConfig, GraphQLSchema, GraphQLSchemaConfig, GraphQLType, GraphQLUnionType, GraphQLUnionTypeConfig } from "grafast/graphql"; import type { Behavior, BehaviorDynamicMethods } from "./behavior.ts"; import type { InflectionBase } from "./inflection.ts"; import type { stringTypeSpec, wrapDescription } from "./utils.ts"; interface RegisterObjectType { /** * Register a type by name with the system; names must be unique. It's * strongly advised that your names come from an inflector so that they * can be overridden. When you register a type, you should also supply a * scope so that other plugins may hook it; it can also be helpful to * indicate where a conflict has occurred. */ (typeName: string, scope: GraphileBuild.ScopeObject, specGenerator: () => Omit, "name">, origin: string | null | undefined): void; /** * @deprecated Please pass 'assertStep' as part of the object spec. This * compatibility signature will not be supported for long! */ (typeName: string, scope: GraphileBuild.ScopeObject, assertStep: TStep extends Step ? ((step: Step) => asserts step is TStep) | { new (...args: any[]): TStep; } : null, specGenerator: () => Omit, "name">, origin: string | null | undefined): void; } declare global { namespace GraphileBuild { type BehaviorString = (string & { readonly __incomingBehaviorString: unique symbol; }) | `${"" | "-"}${keyof GraphileBuild.BehaviorStrings}`; /** * Input to the 'schema build' phase, this is typically the output of the * gather phase. */ interface BuildInput { } interface BehaviorStrings { "*": true; } interface BehaviorEntities { string: string; } interface PluginBehaviorEntitySpec { defaultBehavior?: string; getEntityDefaultBehavior?: (entity: GraphileBuild.BehaviorEntities[TEntityType]) => string; getEntityConfiguredBehavior?: (entity: GraphileBuild.BehaviorEntities[TEntityType]) => string; } /** * Details of a single directive application. We typically store a list of * these into an array. Note that we don't use a map for this because: * * 1. the same directive may be used more than once, and * 2. the order of directives may be significant. */ interface DirectiveDetails { directiveName: string; args: { [directiveArgument: string]: any; }; } interface InflectionOptions { } interface GatherOptions { /** * Used in tests to mute expected warnings. Likely to be replaced when * we add a diagnostics system. * * @experimental */ muteWarnings?: boolean; } interface SchemaOptions { /** * A behavior string to prepend to all behavior checks, can be overriden * but is a great way to disable things by default and then re-enable * them in specific locations. */ defaultBehavior?: string; /** * If your schema includes compatibility with the GraphQL Global Object * Identification Specification, typically this will be called 'id'. * However the term 'id' often conflicts with databases which commonly * use 'id' as their primary key name, so we give you the option to * rename it. */ nodeIdFieldName?: string; /** * `SwallowErrorsPlugin` by default will "swallow" errors, allowing you * to continue building your GraphQL schema even if errors (such as * naming conflicts) occur. It is recommended that you set this option to * `true` in your production configuration to disable this behavior. */ dontSwallowErrors?: boolean; /** * When false (default), Grafserv will exit if it fails to build the * initial schema (for example if it cannot connect to the database, or if * there are fatal naming conflicts in the schema). When true, PostGraphile * will keep trying to rebuild the schema indefinitely, using an exponential * backoff between attempts, starting at 100ms and increasing up to 30s delay * between retries. When a function, the function will be called passing the * error and the number of attempts, and it should return true to retry, * false to permanently abort trying. */ retryOnInitFail?: boolean | ((error: Error, attempts: number, delay: number) => boolean | Promise); exportSchemaSDLPath?: string; exportSchemaIntrospectionResultPath?: string; sortExport?: boolean; /** * Used in tests to mute expected warnings. Likely to be replaced when * we add a diagnostics system. * * @experimental */ muteWarnings?: boolean; } /** * Do not change this object, your changes will be ignored. */ type InitObject = Record; /** * All of the inflectors live in this object. Inflectors take a range of * inputs and return a string that can be used as the name for the relevant * type, field, argument, enum value, etc. */ interface Inflection extends InflectionBase { } /** Our take on GraphQLFieldConfigMap that allows for plans */ type GrafastFieldConfigMap = { [fieldName: string]: GrafastFieldConfig; }; /** Our take on GraphQLObjectTypeConfig that allows for plans */ interface GrafastObjectTypeConfig extends Omit, "fields" | "interfaces"> { fields?: GrafastFieldConfigMap | ((context: ContextObjectFields) => GrafastFieldConfigMap); interfaces?: GraphQLInterfaceType[] | ((context: ContextObjectInterfaces) => GraphQLInterfaceType[]); assertStep?: TParentStep extends Step ? ((step: Step) => asserts step is TParentStep) | { new (...args: any[]): TParentStep; } : null; planType?: ($specifier: Step) => TParentStep; } /** Our take on GraphQLInputObjectTypeConfig that allows for plans */ interface GrafastInputObjectTypeConfig extends Omit { fields?: GrafastInputFieldConfigMap | ((context: ContextInputObjectFields) => GrafastInputFieldConfigMap); } /** Our take on GraphQLUnionTypeConfig that allows for plans */ interface GrafastUnionTypeConfig extends Omit, "types"> { types?: GraphQLObjectType[] | ((context: ContextUnionTypes) => GraphQLObjectType[]); /** * Takes a step representing this polymorphic position, and returns a * "specifier" step that will be input to planType. If not specified, the * step's own `.toSpecifier()` will be used, if present, otherwise the * step's own `.toRecord()`, and failing that the step itself. */ toSpecifier?($step: Step): Step; /** * Plantime. `$specifier` is either a step returned from a field or list * position with an abstract type, or a `__ValueStep` that represents the * combined values of such steps (to prevent unbounded plan branching). * `planType` must then construct a step that represents the * `__typename` related to this given specifier (or `null` if no match * can be found) and a `planForType` method which, when called, should * return the step for the given type. */ planType?($specifier: Step, info: PlanTypeInfo): AbstractTypePlanner; } /** Our take on GraphQLInterfaceTypeConfig that allows for plans */ interface GrafastInterfaceTypeConfig extends Omit, "fields" | "interfaces"> { fields?: GraphQLFieldConfigMap | ((context: ContextInterfaceFields) => GraphQLFieldConfigMap); interfaces?: GraphQLInterfaceType[] | ((context: ContextInterfaceInterfaces) => GraphQLInterfaceType[]); /** * Takes a step representing this polymorphic position, and returns a * "specifier" step that will be input to planType. If not specified, the * step's own `.toSpecifier()` will be used, if present, otherwise the * step's own `.toRecord()`, and failing that the step itself. */ toSpecifier?($step: Step): Step; /** * Plantime. `$specifier` is either a step returned from a field or list * position with an abstract type, or a `__ValueStep` that * represents the combined values of such steps (to prevent unbounded * plan branching). `planType` must then construct a step that * represents the `__typename` related to this given specifier (or `null` * if no match can be found) and a `planForType` method which, when * called, should return the step for the given type. */ planType?($specifier: Step, info: PlanTypeInfo): AbstractTypePlanner; } interface BuildVersions { grafast: string; graphql: string; "graphile-build": string; } /** * The absolute bare bones `Build` object that graphile-build makes before * calling any hooks. */ interface BuildBase { /** * Various libraries and utilities to save from having to import them in * plugins (and thereby avoid having module conflict errors). */ lib: GraphileConfig.Lib; /** * The options that graphile-build was called with. */ options: SchemaOptions; /** * Version numbers of the various packages used in this build; plugins * can register versions in here, and other plugins can indicate that * they need certain versions via the `hasVersion` function. */ versions: BuildVersions; /** * Input from the "data gathering" phase that plugins can use to * influence what types/fields/etc are added to the GraphQL schema. */ input: BuildInput; /** * Returns true if `Build.versions` contains an entry for `packageName` * compatible with the version range `range`, false otherwise. */ hasVersion(packageName: string, range: string, options?: { includePrerelease?: boolean; }): boolean; EXPORTABLE(factory: (...args: TScope) => T, args: [...TScope], nameHint?: string): T; EXPORTABLE_ARRAY_CLONE(arr: T, name?: string): T; EXPORTABLE_OBJECT_CLONE(obj: T, name?: string): T; exportNameHint(obj: any, nameHint: string): void; /** * Use `build.grafast` rather than importing `grafast` directly to try * and avoid "duplicate" grafast module woes. */ grafast: typeof import("grafast"); /** * Use `build.graphql` rather than importing `graphql` directly to try * and avoid "duplicate" graphql module woes. */ graphql: typeof import("graphql"); /** * Inflection controls the naming of your fields, types, arguments, etc - * widely used for any situation where you need to name things. Use it often! */ inflection: Inflection; /** * Tracks the status of the SchemaBuilder; useful for making error * messages more helpful. */ status: { /** True after 'build', false before and during. */ isBuildPhaseComplete: boolean; /** True after 'init', false before and during. */ isInitPhaseComplete: boolean; currentHookName: string | null | undefined; currentHookEvent: string | null | undefined; }; /** * Only use this on descriptions that are plain text, or that we create * manually in code; since descriptions are markdown, it's not safe to * use on descriptions that contain code blocks or long inline code * strings. */ wrapDescription: typeof wrapDescription; /** * Generates the spec for a GraphQLScalar (except the name) with the * given description/coercion. */ stringTypeSpec: typeof stringTypeSpec; /** * Register a type by name with the system; names must be unique. It's * strongly advised that your names come from an inflector so that they * can be overridden. When you register a type, you should also supply a * scope so that other plugins may hook it; it can also be helpful to * indicate where a conflict has occurred. */ registerObjectType: RegisterObjectType; /** As registerObjectType, but for interfaces */ registerInterfaceType: (typeName: string, scope: ScopeInterface, specGenerator: () => Omit, "name">, origin: string | null | undefined) => void; /** As registerObjectType, but for unions */ registerUnionType: (typeName: string, scope: ScopeUnion, specGenerator: () => Omit, "name">, origin: string | null | undefined) => void; /** As registerObjectType, but for scalars */ registerScalarType: (typeName: string, scope: ScopeScalar, specGenerator: () => Omit, "name">, origin: string | null | undefined) => void; /** As registerObjectType, but for enums */ registerEnumType: (typeName: string, scope: ScopeEnum, specGenerator: () => Omit, origin: string | null | undefined) => void; /** As registerObjectType, but for input objects */ registerInputObjectType: (typeName: string, scope: ScopeInputObject, specGenerator: () => Omit, origin: string | null | undefined) => void; /** * Asserts that the given typeName is registered; throws if this isn't * the case. */ assertTypeName(typeName: string, deferrable?: boolean): void; /** * Returns details of the type name's registration (if it has been * registered) - useful when types are built based on other types. */ getTypeMetaByName: (typeName: string) => { Constructor: { new (spec: any): GraphQLNamedType; }; scope: GraphileBuild.SomeScope; origin: string | null | undefined; Step?: { new (...args: any[]): Step; } | null; specGenerator: (() => Omit, "name">) | (() => Omit, "name">) | (() => Omit, "name">) | (() => Omit, "name">) | (() => Omit) | (() => Omit); } | null; /** * Returns the GraphQL type with the given name, constructing it if * necessary (assuming there's a registered type generator). If the * constructed type is invalid (e.g. an object type with no fields) then * null will be returned. If the type name is not registered then * undefined will be returned. */ getTypeByName: (typeName: string) => GraphQLNamedType | null | undefined; /** * As `getTypeByName`, except it throws if the returned type was not an * input type. */ getInputTypeByName: (typeName: string) => GraphQLInputType; /** * As `getTypeByName`, except it throws if the returned type was not an * output type. */ getOutputTypeByName: (typeName: string) => GraphQLOutputType; /** * Writes the properties of `extra` into `base` being sure not to * overwrite any properties. The `hint` is provided so that in the case * of a conflict a helpful error message can be raised - use `hint` to * describe what you are doing and when a conflict occurs both hints will * be logged helping users to figure out what went wrong. */ extend: & object>(base: Obj1, extra: Obj2, hint: string, behaviourOnConflict?: "throw" | "recoverable") => Obj1 & Obj2; /** * Appends the entries from `extra` into `base` tracking the `hint` as to * when they were added. If a conflict is found (where `base` already has * an entry with the same `identity(item)` as a new item) an error will * be thrown describing what happened. The `hint` is provided so that in * the case of a conflict a helpful error message can be raised - use * `hint` to describe what you are doing and when a conflict occurs both * hints will be logged helping users to figure out what went wrong. */ append: (base: T[], extra: ReadonlyArray, getIdentity: keyof T | ((entry: T) => ID), hint: string, behaviourOnConflict?: "throw" | "recoverable") => T[]; getAllTypes(): { [typeName: string]: GraphQLNamedType | null | undefined; }; /** * Useful for looking up the scope that a type was created with, e.g. for * debugging. */ scopeByType: Map; /** * When a recoverable error occurs, it will be handed to this method * which can decide what to do - e.g. throw the error or log it. * * Note that all recoverable errors indicate there is something wrong * with your schema that should be addressed, the "recoverable" means it * doesn't entirely prevent us from creating _a_ schema, but the schema * created might not be as full as the one you desired. This is primarily * useful for trying out new plugins/etc so that you can resolve naming * conflicts at a later stage once you're happy. * * In V4 this was called `swallowError`, but that was confusing when * users chose to throw instead. */ handleRecoverableError: (e: Error) => void; /** * Calls callback, but if an error is thrown then it processes it withe * `handleRecoverableError` and then returns the fallback. */ recoverable(fallback: T, callback: () => T): T; /** * If condition is true, returns `type`, otherwise `new GraphQLNonNull(type)` */ nullableIf(condition: boolean, type: T): T | GraphQLNonNull; /** * @param name - the GraphQL name, also $0 in the message * @param message - e.g. `Object type $1 attempted to define a field with invalid name $0.` * @param args - the arguments to populate in message, from $1 onwards * @param allowDoubleUnderscorePrefix - if true, allow `__` prefix (reserved for introspection) */ assertValidName(name: string, message: string, args?: string[], allowDoubleUnderscorePrefix?: boolean): string; _pluginMeta: { [pluginName: string]: Record | undefined; }; } /** * The `Build` object is passed to every schema hook (as the second * argument); it contains useful helpers and utilities and can also store * metadata. It is populated by the 'plugin' hook in various plugins, so * there's no concrete list of all the things in the build object other * than actually inspecting it. */ interface Build extends BuildBase { $$isQuery: symbol; /** * Behavior logic that helps decide whether or not a certain thing * (typically a field, argument, enum value, input field, or similar) * goes into the schema. */ behavior: Behavior & BehaviorDynamicMethods; } /** * When we register a type, field or argument, we associate a 'scope' with * it so that other plugins can easily recognise it. All specialised scopes * inherit this Scope interface. */ interface Scope { directives?: DirectiveDetails[]; } /** * A specialised `Context` object is passed to every schema hook (as the * third argument) based on the hook being called. The context contains * details about _why_ the hook was called. All specialised contexts * inherit this basic Context interface. */ interface Context { scope: Scope; type: "build" | "init" | "finalize" | "GraphQLSchema" | "GraphQLScalarType" | "GraphQLObjectType" | "GraphQLInterfaceType" | "GraphQLUnionType" | "GraphQLEnumType" | "GraphQLInputObjectType"; } interface ScopeBuild extends Scope { } interface ContextBuild extends Context { scope: ScopeBuild; type: "build"; } interface ScopeInit extends Scope { } interface ContextInit extends Context { scope: ScopeInit; type: "init"; } interface ScopeSchema extends Scope { } interface ContextSchema extends Context { scope: ScopeSchema; type: "GraphQLSchema"; } interface ScopeSchemaTypes extends ScopeSchema { } interface ContextSchemaTypes extends ContextSchema { scope: ScopeSchemaTypes; config: GraphQLSchemaConfig; } interface ScopeScalar extends Scope { } interface ContextScalar extends Context { scope: ScopeScalar; type: "GraphQLScalarType"; } interface ScopeObject extends Scope { isRootQuery?: boolean; isRootMutation?: boolean; isRootSubscription?: boolean; isMutationPayload?: boolean; isPageInfo?: boolean; } interface ContextObject extends Context { scope: ScopeObject; type: "GraphQLObjectType"; } interface ScopeObjectInterfaces extends ScopeObject { } interface ContextObjectInterfaces extends ContextObject { scope: ScopeObjectInterfaces; Self: GraphQLObjectType; } interface ScopeObjectFields extends ScopeObject { } interface ContextObjectFields extends ContextObject { scope: ScopeObjectFields; Self: GraphQLObjectType; fieldWithHooks: FieldWithHooksFunction; } interface ScopeObjectFieldsField extends ScopeObjectFields { fieldName: string; fieldBehaviorScope?: string; fieldDirectives?: DirectiveDetails[]; isCursorField?: boolean; } interface ContextObjectFieldsField extends ContextObjectFields { scope: ScopeObjectFieldsField; } interface ScopeObjectFieldsFieldArgs extends ScopeObjectFieldsField { } interface ContextObjectFieldsFieldArgs extends Omit { scope: ScopeObjectFieldsFieldArgs; } interface ScopeObjectFieldsFieldArgsArg extends ScopeObjectFieldsFieldArgs { argName: string; } interface ContextObjectFieldsFieldArgsArg extends ContextObjectFieldsFieldArgs { scope: ScopeObjectFieldsFieldArgsArg; } interface ScopeInterface extends Scope { /** * If true, 'AddNoteInterfaceToSuitableTypesPlugin' will add the `Node` * interface and `id` field automatically to this interface */ supportsNodeInterface?: boolean; } interface ContextInterface extends Context { scope: ScopeInterface; type: "GraphQLInterfaceType"; } interface ScopeInterfaceFields extends ScopeInterface { } interface ContextInterfaceFields extends ContextInterface { scope: ScopeInterfaceFields; Self: GraphQLInterfaceType; fieldWithHooks: InterfaceFieldWithHooksFunction; } interface ScopeInterfaceFieldsField extends ScopeInterfaceFields { fieldName: string; } interface ContextInterfaceFieldsField extends ContextInterfaceFields { scope: ScopeInterfaceFieldsField; } interface ScopeInterfaceFieldsFieldArgs extends ScopeInterfaceFieldsField { } interface ContextInterfaceFieldsFieldArgs extends ContextInterfaceFieldsField { scope: ScopeInterfaceFieldsFieldArgs; } interface ScopeInterfaceFieldsFieldArgsArg extends ScopeInterfaceFieldsFieldArgs { argName: string; } interface ContextInterfaceFieldsFieldArgsArg extends ContextInterfaceFieldsFieldArgs { scope: ScopeInterfaceFieldsFieldArgsArg; } interface ScopeInterfaceInterfaces extends ScopeInterface { } interface ContextInterfaceInterfaces extends ContextInterface { scope: ScopeInterfaceInterfaces; Self: GraphQLInterfaceType; } interface ScopeUnion extends Scope { } interface ContextUnion extends Context { scope: ScopeUnion; type: "GraphQLUnionType"; } interface ScopeUnionTypes extends ScopeUnion { } interface ContextUnionTypes extends ContextUnion { scope: ScopeUnionTypes; Self: GraphQLUnionType; } interface ScopeInputObject extends Scope { isMutationInput?: boolean; } interface ContextInputObject extends Context { scope: ScopeInputObject; type: "GraphQLInputObjectType"; } interface ScopeInputObjectFields extends ScopeInputObject { } interface ContextInputObjectFields extends ContextInputObject { scope: ScopeInputObjectFields; Self: GraphQLInputObjectType; fieldWithHooks: InputFieldWithHooksFunction; } interface ScopeInputObjectFieldsField extends ScopeInputObject { fieldName: string; fieldBehaviorScope?: string; } interface ContextInputObjectFieldsField extends ContextInputObject { scope: ScopeInputObjectFieldsField; Self: GraphQLInputObjectType; } interface ScopeEnum extends Scope { } interface ContextEnum extends Context { scope: ScopeEnum; type: "GraphQLEnumType"; } interface ScopeEnumValues extends ScopeEnum { } interface ContextEnumValues extends ContextEnum { scope: ScopeEnumValues; Self: { name: string; }; } interface ScopeEnumValuesValue extends ScopeEnumValues { valueName: string; } interface ContextEnumValuesValue extends ContextEnumValues { scope: ScopeEnumValuesValue; } interface ScopeFinalize extends Scope { } interface ContextFinalize extends Context { scope: ScopeFinalize; type: "finalize"; } /** * A type that represents all possible scopes. */ type SomeScope = Scope | ScopeBuild | ScopeInit | ScopeSchema | ScopeSchemaTypes | ScopeScalar | ScopeObject | ScopeObjectInterfaces | ScopeObjectFields | ScopeObjectFieldsField | ScopeObjectFieldsFieldArgs | ScopeInterface | ScopeUnion | ScopeUnionTypes | ScopeInputObject | ScopeInputObjectFields | ScopeInputObjectFieldsField | ScopeEnum | ScopeEnumValues | ScopeEnumValuesValue | ScopeFinalize; /** * A Graphile-Build hook function. */ type Hook = Build> = { (input: Type, build: TBuild, context: TContext): Type; displayName?: string; }; /** * A function that instructs graphile-build to create a field with the * given name and apply all the hooks to it. All fields will have hooks * called against them whether they're created with this method or not, but * it gives a chance to get access to extra details (i.e. the field * context) and to set the specialised scope for the field so that other * plugins can hook it. It's highly recommended you use this for all * non-trivial fields. */ type FieldWithHooksFunction = (fieldScope: ScopeObjectFieldsField, spec: GrafastFieldConfig | ((context: ContextObjectFieldsField) => GrafastFieldConfig)) => GrafastFieldConfig; type InterfaceFieldWithHooksFunction = (fieldScope: ScopeInterfaceFieldsField, spec: GraphQLFieldConfig | ((context: ContextInterfaceFieldsField) => GraphQLFieldConfig)) => GraphQLFieldConfig; type InputFieldWithHooksFunction = (fieldScope: ScopeInputObjectFieldsField, spec: GrafastInputFieldConfig | ((context: ContextInputObjectFieldsField) => GrafastInputFieldConfig)) => GrafastInputFieldConfig; /** * These are all of the hooks that graphile-build supports and the types of * the various parameters to the hook function. */ interface SchemaBuilderHooks { /** * The build object represents the current schema build and is passed to all * hooks, hook the 'build' event to extend this object. Note: you MUST NOT * generate GraphQL objects during this phase. */ build: GraphileBuild.Hook & GraphileBuild.BuildBase, GraphileBuild.ContextBuild, Partial & GraphileBuild.BuildBase>[]; /** * The `init` phase runs after `build` is complete but before any types * or the schema are actually built. It is the only phase in which you * can register GraphQL types; do so using `build.registerType`. */ init: GraphileBuild.Hook, GraphileBuild.ContextInit, TBuild>[]; /** * 'finalize' phase is called once the schema is built; typically you * shouldn't use this, but it's useful for interfacing with external * libraries that mutate an already constructed schema. */ finalize: GraphileBuild.Hook[]; /** * Add 'query', 'mutation' or 'subscription' types in this hook: */ GraphQLSchema: GraphileBuild.Hook[]; /** * Add any types that need registering (typically polymorphic types) here */ GraphQLSchema_types: GraphileBuild.Hook[]; /** * When creating a GraphQLObjectType via `newWithHooks`, we'll * execute, the following hooks: * - 'GraphQLObjectType' to add any root-level attributes, e.g. add a description * - 'GraphQLObjectType_interfaces' to add additional interfaces to this object type * - 'GraphQLObjectType_fields' to add additional fields to this object type (is * ran asynchronously and gets a reference to the final GraphQL Object as * `Self` in the context) * - 'GraphQLObjectType_fields_field' to customize an individual field from above * - 'GraphQLObjectType_fields_field_args' to customize the arguments to a field */ GraphQLObjectType: GraphileBuild.Hook, GraphileBuild.ContextObject, TBuild>[]; GraphQLObjectType_interfaces: GraphileBuild.Hook[]; GraphQLObjectType_fields: GraphileBuild.Hook, GraphileBuild.ContextObjectFields, TBuild>[]; GraphQLObjectType_fields_field: GraphileBuild.Hook, GraphileBuild.ContextObjectFieldsField, TBuild>[]; GraphQLObjectType_fields_field_args: GraphileBuild.Hook[]; GraphQLObjectType_fields_field_args_arg: GraphileBuild.Hook, GraphileBuild.ContextObjectFieldsFieldArgsArg, TBuild>[]; /** * When creating a GraphQLInputObjectType via `newWithHooks`, we'll * execute, the following hooks: * - 'GraphQLInputObjectType' to add any root-level attributes, e.g. add a description * - 'GraphQLInputObjectType_fields' to add additional fields to this object type (is * ran asynchronously and gets a reference to the final GraphQL Object as * `Self` in the context) * - 'GraphQLInputObjectType_fields_field' to customize an individual field from above */ GraphQLInputObjectType: GraphileBuild.Hook[]; GraphQLInputObjectType_fields: GraphileBuild.Hook[]; GraphQLInputObjectType_fields_field: GraphileBuild.Hook[]; /** * When creating a GraphQLEnumType via `newWithHooks`, we'll * execute, the following hooks: * - 'GraphQLEnumType' to add any root-level attributes, e.g. add a description * - 'GraphQLEnumType_values' to add additional values * - 'GraphQLEnumType_values_value' to change an individual value */ GraphQLEnumType: GraphileBuild.Hook[]; GraphQLEnumType_values: GraphileBuild.Hook[]; GraphQLEnumType_values_value: GraphileBuild.Hook[]; /** * When creating a GraphQLUnionType via `newWithHooks`, we'll * execute, the following hooks: * - 'GraphQLUnionType' to add any root-level attributes, e.g. add a description * - 'GraphQLUnionType_types' to add additional types to this union */ GraphQLUnionType: GraphileBuild.Hook, GraphileBuild.ContextUnion, TBuild>[]; GraphQLUnionType_types: GraphileBuild.Hook[]; /** * When creating a GraphQLInterfaceType via `newWithHooks`, we'll * execute, the following hooks: * - 'GraphQLInterfaceType' to add any root-level attributes, e.g. add a description * - 'GraphQLInterfaceType_fields' to add additional fields to this interface type (is * ran asynchronously and gets a reference to the final GraphQL Interface as * `Self` in the context) * - 'GraphQLInterfaceType_fields_field' to customise an individual field from above * - 'GraphQLInterfaceType_fields_field_args' to customize the arguments to a field */ GraphQLInterfaceType: GraphileBuild.Hook, GraphileBuild.ContextInterface, TBuild>[]; GraphQLInterfaceType_fields: GraphileBuild.Hook, GraphileBuild.ContextInterfaceFields, TBuild>[]; GraphQLInterfaceType_fields_field: GraphileBuild.Hook, GraphileBuild.ContextInterfaceFieldsField, TBuild>[]; GraphQLInterfaceType_fields_field_args: GraphileBuild.Hook[]; GraphQLInterfaceType_fields_field_args_arg: GraphileBuild.Hook[]; GraphQLInterfaceType_interfaces: GraphileBuild.Hook[]; /** * For scalars */ GraphQLScalarType: GraphileBuild.Hook, GraphileBuild.ContextScalar, TBuild>[]; } } } export type ConstructorForType = { new (): TType; }; /** * The minimal spec required to be fed to `newWithHooks`; typically this is * just the `name` of the type and everything else is optional. */ export type SpecForType = TType extends GraphQLSchema ? Partial : TType extends GraphQLObjectType ? Partial> & { name: string; } : TType extends GraphQLInterfaceType ? Partial> & { name: string; } : TType extends GraphQLUnionType ? Partial> & { name: string; } : TType extends GraphQLScalarType ? Partial> & { name: string; } : TType extends GraphQLEnumType ? Partial & { name: string; } : TType extends GraphQLInputObjectType ? Partial & { name: string; } : never; export type ScopeForType = TType extends GraphQLSchema ? GraphileBuild.ScopeSchema : never; export {}; //# sourceMappingURL=global.d.ts.map