/** * Used internally to verify that some type is enum-like. * A type is enum-like if all its properties are of type number or string. * @template V - Type of the enum value. * @template K - String literal union of all keys of the enum-like type. */ export declare type EnumLike = { [P in K]: V; }; /** * Extracts only keys of type T that are assignable to type `string`. * This is necessary starting with TypeScript 2.9 because keyof T can now * include `number` and `symbol` types. */ export declare type StringKeyOf = Extract; /** * Utility type that matches values of an object and return the matching keys */ export declare type MatchValues = Extract<{ [K in keyof T]: { key: K; type: T[K]; }; }[keyof T], { key: string; type: V; }> extends { key: infer K; } ? (K extends keyof T ? K : never) : never; /** * Utility type that omit keys of a type */ export declare type Omit = Pick>; export declare type IsNever = T extends never ? true : false; /** * Utility type that make specified fields required and the rest optional */ export declare type RequiredKeys = ({ map: { [K in R]-?: T[K]; } & { [K in Exclude]?: T[K]; }; }) extends { map: infer U; } ? { [K in keyof U]: U[K]; } : never; /** * Utility type that optionalize object keys that have optional values */ export declare type Optionalize = RequiredKeys extends never ? (T[K] extends {} ? (keyof T[K] extends never ? false : (Partial extends T[K] ? false : true)) : true) : false); }, true>>; /** * Utility type that make specified fields optional and the rest required */ export declare type PartialKeys = RequiredKeys>; /** * Wrap a value inside a function */ export declare type Thunk = (() => T) | T; /** * Schema scalar type parser map for encode and decode */ export declare type SchemaScalarTypeConfig = { /** * Decode from Facebook Graph JSON type to JavaScript type * @param value */ decode: (value: O) => T; /** * Encode from Javascript type to Facebook Graph JSON type * @param value */ encode: (value: T) => O; }; /** * All scalar types mapped to their parsers */ export declare type SchemaScalarTypeMap = { [K in keyof typeof schemaScalarTypes]: SchemaScalarTypeConfig; }; /** * All singular scalar types accepted on schema */ export declare type SchemaScalarType = keyof SchemaScalarTypeMap; export declare type SchemaObjectTypeFieldValue = SchemaFieldDefinition> = T extends SchemaFieldDefinition ? Thunk> | T : never; /** * Inferable schema field map */ export declare type SchemaObjectTypeFieldMap = SchemaObjectTypeFieldValue> = Record; /** * Schema enum type */ export interface SchemaEnumType> = any> { name: string; enum: T; } /** * Schema natural object type */ export interface SchemaObjectType = SchemaObjectTypeFieldMap> { name: string; fields: F; } /** * Schema object output type field map */ export declare type SchemaObjectOutputTypeFieldMap = SchemaObjectTypeFieldMap>; /** * Schema object output type field map for connection objects */ export declare type SchemaObjectConnectionOutputTypeFieldMap = SchemaObjectOutputTypeFieldMap & { data: SchemaOutputTypeFieldDefinition & { list: true; }; }; export declare type SchemaObjectInputTypeFieldMap = SchemaObjectTypeFieldMap>; /** * Schema object type */ export declare type SchemaObjectOutputType = SchemaCommonObjectOutputType | SchemaObjectConnectionOutputType; /** * Schema normal object output type (not an edge) */ export interface SchemaCommonObjectOutputType extends SchemaObjectType> { connection?: false; } /** * Schema connection object output type */ export interface SchemaObjectConnectionOutputType extends SchemaObjectType> { connection: true; fields: SchemaObjectConnectionOutputTypeFieldMap; } /** * Schema output type */ export declare type SchemaOutputType = SchemaScalarType | SchemaEnumType | SchemaObjectOutputType; /** * Schema object input type */ export interface SchemaObjectInputType extends SchemaObjectType> { } /** * Schema input type */ export declare type SchemaInputType = SchemaScalarType | SchemaEnumType | SchemaObjectInputType; /** * Schema field type definition */ export interface SchemaFieldDefinition { /** * Rather the field is nullable */ nullable?: true | false; /** * Rather the field is a list */ list?: true | false; /** * Rather the field item is nullable */ nullableItem?: this extends { list: true; } ? true | false : false; /** * The field type */ type: Thunk; } /** * Schema input type field definition */ export interface SchemaInputTypeFieldDefinition extends SchemaFieldDefinition { } /** * Schema field definition */ export interface SchemaOutputTypeFieldDefinition extends SchemaFieldDefinition { /** * If fields is present even if not selected */ core?: true | false; /** * If field is present when no field is selected */ default?: true | false; /** * The field modifiers */ modifiers?: SchemaObjectInputTypeFieldMap; } /** * Transforms schema scalar type to it's JavaScript type */ export declare type TransformSchemaScalarType = STM[K] extends SchemaScalarTypeConfig ? ReturnType<(DECODE extends true ? STM[K]['decode'] : STM[K]['encode'])> : never; /** * Transforms schema nullable item to JavaScript type */ export declare type TransformSchemaListItemType = S extends { list: true; nullableItem: true; } ? T | undefined : T; /** * Transforms schema list to javascript type */ export declare type TransformSchemaListType = S extends { list: true; } ? TransformSchemaListItemType[] : T; /** * Transforms schema nullable to javascript type */ export declare type TransformSchemaNullableType = S extends { nullable: true; } ? TransformSchemaListType | undefined : TransformSchemaListType; /** * Transforms schema field */ export declare type TransformSchemaFieldType = S extends Thunk ? TransformSchemaType : (S extends SchemaFieldDefinition ? TransformSchemaNullableType, S> : never); export declare type TransformSchemaFieldMapType = F extends SchemaObjectTypeFieldMap ? PartialKeys<{ [K in keyof F]: TransformSchemaFieldType; }, MatchValues> : never; /** * Transforms any schema type to it's javascript single type */ export declare type TransformSchemaType = S extends Thunk ? (S extends SchemaScalarType ? TransformSchemaScalarType : (S extends SchemaEnumType ? keyof S['enum'] : (S extends SchemaObjectType ? TransformSchemaFieldMapType : never))) : never; export declare type FormatSchemaExecution = ({ format: Optionalize; }) extends { format: infer U; } ? (SUB extends true ? (Partial extends U ? (SUB extends true ? (null | U) : U) : U) : U) : never; /** * Format schema selection */ /** * Schema modifiers selection */ export declare type SchemaModifierExecution = keyof M extends never ? never : TransformSchemaFieldMapType; /** * Schema field selection */ export declare type SchemaFieldExecution = S extends Thunk ? SchemaExecution : (S extends SchemaFieldDefinition ? (S extends { modifiers: infer M; } ? SchemaExecution : SchemaExecution) : never); /** * Schema selection */ export declare type SchemaExecution = S extends Thunk ? (S extends SchemaScalarType | SchemaEnumType ? FormatSchemaExecution<{ modifiers: SchemaModifierExecution; fields: never; }, SUB> : (S extends { connection: true; fields: { data: infer D; }; } ? (D extends { type: Thunk>; } ? FormatSchemaExecution<{ modifiers: SchemaModifierExecution; fields: RequiredKeys<{ [K in keyof F]: SchemaFieldExecution; }, MatchValues>; }, SUB> : FormatSchemaExecution<{ modifiers: SchemaModifierExecution; fields: never; }, SUB>) : (S extends SchemaObjectType ? FormatSchemaExecution<{ modifiers: SchemaModifierExecution; fields: RequiredKeys<{ [K in keyof F]: SchemaFieldExecution; }, MatchValues>; }, SUB> : never))) : never; export declare type SchemaObjectTypeFieldMapFilterRecursion = F extends SchemaObjectTypeFieldMap ? (({ data: Pick, M>>; }) extends { data: infer D; } ? (keyof D extends never ? {} : { [K in keyof D]: SchemaObjectTypeFieldFilterRecursion extends true ? M : MM, never>; }) : never) : never; export declare type SchemaObjectTypeFieldFilterRecursion = S extends Thunk ? SchemaObjectTypeFieldFilterMatch : (S extends SchemaFieldDefinition ? Omit & { type: SchemaObjectTypeFieldFilterMatch; } : never); export declare type SchemaObjectTypeFieldFilter = S extends Thunk ? SchemaObjectTypeFieldFilterMatch : (S extends SchemaFieldDefinition ? Omit & { type: SchemaObjectTypeFieldFilterMatch; } : never); /** * Filter schema type based on field definition */ export declare type SchemaObjectTypeFieldFilterMatch = S extends Thunk ? (S extends SchemaScalarType | SchemaEnumType ? S : (S extends SchemaObjectType ? (S extends { connection: true; fields: { data: infer D; }; } ? Omit & { fields: { data: SchemaObjectTypeFieldFilter; } & Omit; } : Omit & { fields: SchemaObjectTypeFieldMapFilterRecursion; }) : never)) : never; /** * Format schema to default execution */ export declare type FormatSchemaDefaultOutput = SchemaObjectTypeFieldMapFilterRecursion; export declare type FormatSchemaCoreOutput = SchemaObjectTypeFieldMapFilterRecursion; export declare type FormatSchemaFieldOutput = S extends Thunk ? FormatSchemaOutput : (S extends SchemaFieldDefinition ? Omit & { type: FormatSchemaOutput; } : never); export declare type FormatSchemaFieldMapOutput = F extends SchemaObjectTypeFieldMap ? (P extends { fields: {}; } ? (Exclude> extends never ? FormatSchemaDefaultOutput : (({ data: Pick>>; }) extends { data: infer D; } ? (keyof D extends string ? (({ core: FormatSchemaCoreOutput; }) extends { core: infer C; } ? ({ [K in keyof D]: FormatSchemaFieldOutput; } & Omit & { [K in Exclude]: { type: never; }; }) : never) : FormatSchemaDefaultOutput) : never)) : FormatSchemaDefaultOutput) : never; export declare type FormatSchemaOutput = S extends Thunk ? (S extends SchemaScalarType | SchemaEnumType ? S : (S extends SchemaObjectType ? (S extends { connection: true; fields: { data: infer D; }; } ? Omit & { fields: ({ data: FormatSchemaFieldOutput; } & (P extends { modifiers: { summary: (infer SMF)[]; }; } ? (FormatSchemaCoreOutput> & (F extends { summary: infer SM; } ? { summary: FormatSchemaFieldOutput]: null; }; }>; } : {})) : FormatSchemaCoreOutput>)); } : Omit & { fields: FormatSchemaFieldMapOutput; }) : never)) : never; export declare type SchemaFields = S extends Thunk ? (S extends SchemaScalarType | SchemaEnumType ? never : (S extends SchemaObjectType ? keyof F : never)) : never; export declare type SchemaField = S extends Thunk ? (S extends SchemaScalarType | SchemaEnumType ? never : (S extends SchemaObjectType ? (F[K] extends SchemaFieldDefinition ? T : F[K]) : never)) : never; export declare type SchemaPathTuples = [string] | [string, string] | [string, string, string] | [string, string, string, string]; export declare type SchemaPath>, P extends SchemaPathTuples> = P extends [string] ? SchemaField : (P extends [string, string] ? SchemaField, P[1]> : (P extends [string, string, string] ? SchemaField, P[1]>, P[2]> : (P extends [string, string, string, string] ? SchemaField, P[1]>, P[2]>, P[3]> : never))); export declare type SchemaThunkObjectType = Thunk>; export declare function getSchemaPath>, P extends SchemaPathTuples>(type: S, ...path: P): SchemaPath; export declare const schemaScalarTypes: { String: { decode: (value: any) => string; encode: (value: string) => any; }; Any: { decode: (value: any) => any; encode: (value: any) => any; }; Float: { decode: (value: any) => number; encode: (value: number) => any; }; Int: { decode: (value: any) => number; encode: (value: number) => any; }; ID: { decode: (value: any) => string; encode: (value: string) => any; }; DateTime: { decode: (value: any) => Date; encode: (value: Date) => any; }; Boolean: { decode: (value: any) => boolean; encode: (value: boolean) => any; }; }; export declare const Type: { [K in keyof typeof schemaScalarTypes]: K; } & { true: true; false: true; modifiers(modifiers: T): T; inputField(field: T): T; outputField(field: T): T; ConnectionObjectType(name: string, fields: F): SchemaObjectType & { connection: true; }; ObjectType: { (name: string, mixin: () => T[], fields: F): SchemaObjectType; (name: string, mixin: () => T[]): SchemaObjectType; (name: string, fields: F): SchemaObjectType; }; InputType: { (name: string, mixin: () => T[], fields?: F): SchemaObjectType; (name: string, fields: F): SchemaObjectType; }; EnumType>>(name: string, enumerator: T): SchemaEnumType; }; export declare function isThunkType(type: any): type is () => T; export declare function isScalarType(type: any): type is keyof SchemaScalarTypeMap; export declare function isEnumType(type: any): type is SchemaEnumType; export declare function isObjectType(type: any): type is SchemaObjectType>; export declare function isObjectTypeFieldDefinition(field: any): field is SchemaFieldDefinition; export declare function getSchemaType(type: Thunk): T; export declare function getSchemaFieldType(field: Thunk> | SchemaFieldDefinition): typeof field extends Thunk> | SchemaFieldDefinition ? R : never; export declare function transformSchemaType(scalarTypes: STM, type: Thunk, value: any, decode?: DECODE): TransformSchemaType, DECODE>;