import type { Maybe } from '../jsutils/Maybe.js';
import type { DirectiveLocation } from '../language/directiveLocation.js';
export interface IntrospectionOptions {
descriptions?: boolean;
specifiedByUrl?: boolean;
directiveIsRepeatable?: boolean;
schemaDescription?: boolean;
inputValueDeprecation?: boolean;
}
export function getIntrospectionQuery(options?: IntrospectionOptions): string {
const optionsWithDefault = {
descriptions: true,
specifiedByUrl: false,
directiveIsRepeatable: false,
schemaDescription: false,
inputValueDeprecation: false,
...options,
};
const descriptions = optionsWithDefault.descriptions ? 'description' : '';
const specifiedByUrl = optionsWithDefault.specifiedByUrl
? 'specifiedByURL'
: '';
const directiveIsRepeatable = optionsWithDefault.directiveIsRepeatable
? 'isRepeatable'
: '';
const schemaDescription = optionsWithDefault.schemaDescription
? descriptions
: '';
function inputDeprecation(str: string) {
return optionsWithDefault.inputValueDeprecation ? str : '';
}
return `
query IntrospectionQuery {
__schema {
${schemaDescription}
queryType { name }
mutationType { name }
subscriptionType { name }
types {
...FullType
}
directives {
name
${descriptions}
${directiveIsRepeatable}
locations
args${inputDeprecation('(includeDeprecated: true)')} {
...InputValue
}
}
}
}
fragment FullType on __Type {
kind
name
${descriptions}
${specifiedByUrl}
fields(includeDeprecated: true) {
name
${descriptions}
args${inputDeprecation('(includeDeprecated: true)')} {
...InputValue
}
type {
...TypeRef
}
isDeprecated
deprecationReason
}
inputFields${inputDeprecation('(includeDeprecated: true)')} {
...InputValue
}
interfaces {
...TypeRef
}
enumValues(includeDeprecated: true) {
name
${descriptions}
isDeprecated
deprecationReason
}
possibleTypes {
...TypeRef
}
}
fragment InputValue on __InputValue {
name
${descriptions}
type { ...TypeRef }
defaultValue
${inputDeprecation('isDeprecated')}
${inputDeprecation('deprecationReason')}
}
fragment TypeRef on __Type {
kind
name
ofType {
kind
name
ofType {
kind
name
ofType {
kind
name
ofType {
kind
name
ofType {
kind
name
ofType {
kind
name
ofType {
kind
name
}
}
}
}
}
}
}
}
`;
}
export interface IntrospectionQuery {
readonly __schema: IntrospectionSchema;
}
export interface IntrospectionSchema {
readonly description?: Maybe<string>;
readonly queryType: IntrospectionNamedTypeRef<IntrospectionObjectType>;
readonly mutationType: Maybe<
IntrospectionNamedTypeRef<IntrospectionObjectType>
>;
readonly subscriptionType: Maybe<
IntrospectionNamedTypeRef<IntrospectionObjectType>
>;
readonly types: ReadonlyArray<IntrospectionType>;
readonly directives: ReadonlyArray<IntrospectionDirective>;
}
export type IntrospectionType =
| IntrospectionScalarType
| IntrospectionObjectType
| IntrospectionInterfaceType
| IntrospectionUnionType
| IntrospectionEnumType
| IntrospectionInputObjectType;
export type IntrospectionOutputType =
| IntrospectionScalarType
| IntrospectionObjectType
| IntrospectionInterfaceType
| IntrospectionUnionType
| IntrospectionEnumType;
export type IntrospectionInputType =
| IntrospectionScalarType
| IntrospectionEnumType
| IntrospectionInputObjectType;
export interface IntrospectionScalarType {
readonly kind: 'SCALAR';
readonly name: string;
readonly description?: Maybe<string>;
readonly specifiedByURL?: Maybe<string>;
}
export interface IntrospectionObjectType {
readonly kind: 'OBJECT';
readonly name: string;
readonly description?: Maybe<string>;
readonly fields: ReadonlyArray<IntrospectionField>;
readonly interfaces: ReadonlyArray<
IntrospectionNamedTypeRef<IntrospectionInterfaceType>
>;
}
export interface IntrospectionInterfaceType {
readonly kind: 'INTERFACE';
readonly name: string;
readonly description?: Maybe<string>;
readonly fields: ReadonlyArray<IntrospectionField>;
readonly interfaces: ReadonlyArray<
IntrospectionNamedTypeRef<IntrospectionInterfaceType>
>;
readonly possibleTypes: ReadonlyArray<
IntrospectionNamedTypeRef<IntrospectionObjectType>
>;
}
export interface IntrospectionUnionType {
readonly kind: 'UNION';
readonly name: string;
readonly description?: Maybe<string>;
readonly possibleTypes: ReadonlyArray<
IntrospectionNamedTypeRef<IntrospectionObjectType>
>;
}
export interface IntrospectionEnumType {
readonly kind: 'ENUM';
readonly name: string;
readonly description?: Maybe<string>;
readonly enumValues: ReadonlyArray<IntrospectionEnumValue>;
}
export interface IntrospectionInputObjectType {
readonly kind: 'INPUT_OBJECT';
readonly name: string;
readonly description?: Maybe<string>;
readonly inputFields: ReadonlyArray<IntrospectionInputValue>;
}
export interface IntrospectionListTypeRef<
T extends IntrospectionTypeRef = IntrospectionTypeRef,
> {
readonly kind: 'LIST';
readonly ofType: T;
}
export interface IntrospectionNonNullTypeRef<
T extends IntrospectionTypeRef = IntrospectionTypeRef,
> {
readonly kind: 'NON_NULL';
readonly ofType: T;
}
export type IntrospectionTypeRef =
| IntrospectionNamedTypeRef
| IntrospectionListTypeRef
| IntrospectionNonNullTypeRef<
IntrospectionNamedTypeRef | IntrospectionListTypeRef
>;
export type IntrospectionOutputTypeRef =
| IntrospectionNamedTypeRef<IntrospectionOutputType>
| IntrospectionListTypeRef<IntrospectionOutputTypeRef>
| IntrospectionNonNullTypeRef<
| IntrospectionNamedTypeRef<IntrospectionOutputType>
| IntrospectionListTypeRef<IntrospectionOutputTypeRef>
>;
export type IntrospectionInputTypeRef =
| IntrospectionNamedTypeRef<IntrospectionInputType>
| IntrospectionListTypeRef<IntrospectionInputTypeRef>
| IntrospectionNonNullTypeRef<
| IntrospectionNamedTypeRef<IntrospectionInputType>
| IntrospectionListTypeRef<IntrospectionInputTypeRef>
>;
export interface IntrospectionNamedTypeRef<
T extends IntrospectionType = IntrospectionType,
> {
readonly kind: T['kind'];
readonly name: string;
}
export interface IntrospectionField {
readonly name: string;
readonly description?: Maybe<string>;
readonly args: ReadonlyArray<IntrospectionInputValue>;
readonly type: IntrospectionOutputTypeRef;
readonly isDeprecated: boolean;
readonly deprecationReason: Maybe<string>;
}
export interface IntrospectionInputValue {
readonly name: string;
readonly description?: Maybe<string>;
readonly type: IntrospectionInputTypeRef;
readonly defaultValue: Maybe<string>;
readonly isDeprecated?: boolean;
readonly deprecationReason?: Maybe<string>;
}
export interface IntrospectionEnumValue {
readonly name: string;
readonly description?: Maybe<string>;
readonly isDeprecated: boolean;
readonly deprecationReason: Maybe<string>;
}
export interface IntrospectionDirective {
readonly name: string;
readonly description?: Maybe<string>;
readonly isRepeatable?: boolean;
readonly locations: ReadonlyArray<DirectiveLocation>;
readonly args: ReadonlyArray<IntrospectionInputValue>;
}