UNPKG

nexus

Version:

Scalable, strongly typed GraphQL schema development

170 lines (169 loc) 8.48 kB
import type { GraphQLCompositeType, GraphQLEnumType, GraphQLFieldConfig, GraphQLInputObjectType, GraphQLInputObjectTypeConfig, GraphQLInterfaceType, GraphQLInterfaceTypeConfig, GraphQLLeafType, GraphQLObjectType, GraphQLObjectTypeConfig, GraphQLScalarType, GraphQLSchema, GraphQLUnionType } from 'graphql'; import type { NexusFieldExtension, NexusInputObjectTypeExtension, NexusInterfaceTypeExtension, NexusObjectTypeExtension, NexusSchemaExtension } from '../extensions'; import type * as AbstractTypes from '../typegenAbstractTypes'; import type { RequiredDeeply } from '../typeHelpersInternal'; export type { AbstractTypes }; /** Conveniently represents flow's "Maybe" type https://flow.org/en/docs/types/maybe/ */ export declare type Maybe<T> = null | undefined | T; export declare type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>; export declare type BaseScalars = 'String' | 'Int' | 'Float' | 'ID' | 'Boolean'; export declare enum NexusTypes { Arg = "Arg", DynamicInput = "DynamicInput", DynamicOutputMethod = "DynamicOutputMethod", DynamicOutputProperty = "DynamicOutputProperty", Enum = "Enum", ExtendInputObject = "ExtendInputObject", ExtendObject = "ExtendObject", InputField = "InputField", InputObject = "InputObject", Interface = "Interface", List = "List", NonNull = "NonNull", Null = "Null", Object = "Object", OutputField = "OutputField", Plugin = "Plugin", PrintedGenTyping = "PrintedGenTyping", PrintedGenTypingImport = "PrintedGenTypingImport", Scalar = "Scalar", Union = "Union" } export interface DeprecationInfo { /** Reason for the deprecation. */ reason: string; /** Date | YYYY-MM-DD formatted date of when this field became deprecated. */ startDate?: string | Date; /** Field or usage that replaces the deprecated field. */ supersededBy?: string; } /** * [Nullability Guide](https://nxs.li/guides/nullability) * * Configures the default nullability for fields and arguments. */ export interface NonNullConfig { /** * Whether output field (object type fields) types are non-null by default. * * @default false */ output?: boolean; /** * Whether input field (field arguments, input object type fields) types are non-null by default. * * @default false */ input?: boolean; } export declare type GraphQLPossibleOutputs = GraphQLCompositeType | GraphQLLeafType; export declare type GraphQLPossibleInputs = GraphQLInputObjectType | GraphQLLeafType; export declare const NexusWrappedSymbol: unique symbol; export declare function withNexusSymbol(obj: Function, nexusType: NexusTypes): void; export interface AsyncIterator<T> { next(value?: any): Promise<IteratorResult<T>>; return?(value?: any): Promise<IteratorResult<T>>; throw?(e?: any): Promise<IteratorResult<T>>; } export declare type SourceTypingDef = string | TypingImport; export declare type SourceTypings = Record<string, string | TypingImport>; export interface TypingImport { /** An absolute path to a module in your project or the name of a package installed in your project. */ module: string; /** The name of a type exported from the module/package (specified in `module`) that you want to use. */ export: string; /** * The name you want the imported type to be referenced as in the typegen. * * This is useful when there is already a typegen import whose name would conflict with this type name. * * Default :: By default no import alias will be used. */ alias?: string; } export interface MissingType { fromObject: boolean; } export declare type GraphQLNamedOutputType = GraphQLScalarType | GraphQLObjectType | GraphQLInterfaceType | GraphQLUnionType | GraphQLEnumType; export declare type GraphQLNamedInputType = GraphQLScalarType | GraphQLInputObjectType | GraphQLEnumType; declare type WithExt<T extends { extensions?: any; }, Ext> = Omit<T, 'extensions'> & { extensions?: Maybe<{ nexus?: Ext; }>; }; export declare type NexusGraphQLFieldConfig = WithExt<GraphQLFieldConfig<any, any>, NexusFieldExtension> & { name: string; }; export declare type NexusGraphQLObjectTypeConfig = WithExt<GraphQLObjectTypeConfig<any, any>, NexusObjectTypeExtension>; export declare type NexusGraphQLInputObjectTypeConfig = WithExt<GraphQLInputObjectTypeConfig, NexusInputObjectTypeExtension>; export declare type NexusGraphQLInterfaceTypeConfig = WithExt<GraphQLInterfaceTypeConfig<any, any>, NexusInterfaceTypeExtension> & { interfaces: () => GraphQLInterfaceType[]; }; export interface NexusGraphQLSchema extends GraphQLSchema { extensions: { nexus: NexusSchemaExtension; [attributeName: string]: unknown; }; } export declare type NexusFeaturesInput = { /** * Toggle runtime checks for correct implementation of abstract types. This is a redundant check Nexus makes * over the existing static typings it provides. * * Remarks :: This is useful for beginners because Nexus can give clear concise error messages unlike the * static type errors. * * Note that if you enable the "abstractTypeStrategies.__typename" feature then this feature will be * automatically disabled. For why this is, see that features' remarks. */ abstractTypeRuntimeChecks?: boolean; /** * Toggle abstract-type strategies. For more detail about this feature please refer to to the [abstract * types guide](https://nxs.li/guides/abstract-types). * * If you plan on enabling multiple strategies and you've never done so then please [read the guide about * using multiple strategies](https://nxs.li/guides/abstract-types/using-multiple-strategies) as there are * a few quirks to be aware of. * * @default {resolveType: true, * __typename: false * isTypeOf: false,} */ abstractTypeStrategies?: { /** * The Modular abstract type strategy. Every member object of an abstract type (union members or interface * implementors) will generally be required to implement isTypeOf method. Nexus will not require it in * cases where it detects you have implemented another strategy. For more detail see the guide for the * [Modular Abstract Type Strategy](https://nxs.li/guides/abstract-types/modular-strategy). */ isTypeOf?: boolean; /** * The Centralized abstract type strategy. Every abstract type (union or interface) will generally be * required to implement its resolveType method. Nexus will not require it in cases where it detects you * have implemented another strategy. For more detail see the guide for the [Central Abstract Type * Strategy](https://nxs.li/guides/abstract-types/centralized-strategy). */ resolveType?: boolean; /** * The Discriminant Model Field strategy. In this mode the resolvers of fields typed as abstract types * will be required to include "__typename" field in the returned data. For more detail see the guide for * the [Discriminant Model Field Strategy](https://nxs.li/guides/abstract-types/discriminant-model-field-strategy). * * Warning :: When this strategy is enabled in conjunction with other strategies the * "abstractTypeRuntimeChecks" feature will automatically be disabled. This is because it is not * practical at runtime to find out if resolvers will return objects that include the "__typename" field. * This trade-off can be acceptable since the runtime checks are a redundant safety measure over the * static typing. So as long as you are not ignoring static errors related to Nexus' abstract type type * checks then you then you should still have a safe implementation. * * Furthermore another effect is that statically the other strategies will not appear to be *required*, * but instead *optional*, while only this one will appear required. However, upon implementing any of * the other strategies, this one will not longer be required. This quirk is explained in the guide * section about [using multiple strategies](https://nxs.li/guides/abstract-types/using-multiple-strategies). */ __typename?: boolean; }; }; export declare type NexusFeatures = RequiredDeeply<NexusFeaturesInput>;