graphql
Version:
A Query Language and Runtime which can target any service.
1 lines • 36.8 kB
Source Map (JSON)
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/type/schema.ts"],"names":[],"mappings":"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","sourcesContent":["/** @category Schema */\n\nimport { inspect } from '../jsutils/inspect.ts';\nimport { instanceOf } from '../jsutils/instanceOf.ts';\nimport type { Maybe } from '../jsutils/Maybe.ts';\nimport type { ObjMap } from '../jsutils/ObjMap.ts';\nimport { toObjMapWithSymbols } from '../jsutils/toObjMap.ts';\n\nimport type { GraphQLError } from '../error/GraphQLError.ts';\n\nimport type {\n SchemaDefinitionNode,\n SchemaExtensionNode,\n} from '../language/ast.ts';\nimport { OperationTypeNode } from '../language/ast.ts';\n\nimport type {\n GraphQLAbstractType,\n GraphQLCompositeType,\n GraphQLField,\n GraphQLInterfaceType,\n GraphQLNamedType,\n GraphQLObjectType,\n GraphQLType,\n} from './definition.ts';\nimport {\n getNamedType,\n isInputObjectType,\n isInterfaceType,\n isObjectType,\n isUnionType,\n} from './definition.ts';\nimport type { GraphQLDirective } from './directives.ts';\nimport { isDirective, specifiedDirectives } from './directives.ts';\nimport {\n __Schema,\n SchemaMetaFieldDef,\n TypeMetaFieldDef,\n TypeNameMetaFieldDef,\n} from './introspection.ts';\n\n/**\n * Test if the given value is a GraphQL schema.\n * @param schema - Value to inspect.\n * @returns True when the value is a GraphQLSchema.\n * @example\n * ```ts\n * import { buildSchema } from 'graphql/utilities';\n * import { GraphQLString, isSchema } from 'graphql/type';\n *\n * const schema = buildSchema(`\n * type Query {\n * greeting: String\n * }\n * `);\n *\n * isSchema(schema); // => true\n * isSchema(GraphQLString); // => false\n * ```\n */\nexport function isSchema(schema: unknown): schema is GraphQLSchema {\n return instanceOf(schema, schemaSymbol, GraphQLSchema);\n}\n\n/**\n * Returns the value as a GraphQLSchema, or throws if it is not a schema.\n * @param schema - GraphQL schema to use.\n * @returns The value typed as a GraphQLSchema.\n * @example\n * ```ts\n * import { buildSchema } from 'graphql/utilities';\n * import { assertSchema, GraphQLString } from 'graphql/type';\n *\n * const schema = buildSchema(`\n * type Query {\n * greeting: String\n * }\n * `);\n *\n * assertSchema(schema); // => schema\n * assertSchema(GraphQLString); // throws an error\n * ```\n */\nexport function assertSchema(schema: unknown): GraphQLSchema {\n if (!isSchema(schema)) {\n throw new Error(`Expected ${inspect(schema)} to be a GraphQL schema.`);\n }\n return schema;\n}\n\n/**\n * Custom extensions\n * @remarks\n * Use a unique identifier name for your extension, for example the name of\n * your library or project. Do not use a shortened identifier as this increases\n * the risk of conflicts. We recommend you add at most one extension field,\n * an object which can contain all the values you need.\n */\nexport interface GraphQLSchemaExtensions {\n [attributeName: string | symbol]: unknown;\n}\n\n/** @private */\nconst schemaSymbol: unique symbol = Symbol('Schema');\n\n/**\n * Schema Definition\n *\n * A Schema is created by supplying the root types of each type of operation,\n * query and mutation (optional). A schema definition is then supplied to the\n * validator and executor.\n * @example\n * ```ts\n * const MyAppQueryRootType = new GraphQLObjectType({\n * name: 'Query',\n * fields: {\n * greeting: { type: GraphQLString },\n * },\n * });\n *\n * const MyAppMutationRootType = new GraphQLObjectType({\n * name: 'Mutation',\n * fields: {\n * setGreeting: { type: GraphQLString },\n * },\n * });\n *\n * const MyAppSchema = new GraphQLSchema({\n * query: MyAppQueryRootType,\n * mutation: MyAppMutationRootType,\n * });\n * ```\n * @example\n * When the schema is constructed, by default only the types that are reachable\n * by traversing the root types are included, other types must be explicitly\n * referenced.\n *\n * ```ts\n * const characterInterface = new GraphQLInterfaceType({\n * name: 'Character',\n * fields: {\n * name: { type: GraphQLString },\n * },\n * });\n *\n * const humanType = new GraphQLObjectType({\n * name: 'Human',\n * interfaces: [characterInterface],\n * fields: {\n * name: { type: GraphQLString },\n * },\n * });\n *\n * const droidType = new GraphQLObjectType({\n * name: 'Droid',\n * interfaces: [characterInterface],\n * fields: {\n * name: { type: GraphQLString },\n * },\n * });\n *\n * const schema = new GraphQLSchema({\n * query: new GraphQLObjectType({\n * name: 'Query',\n * fields: {\n * hero: { type: characterInterface },\n * },\n * }),\n * // Since this schema references only the `Character` interface it's\n * // necessary to explicitly list the types that implement it if\n * // you want them to be included in the final schema.\n * types: [humanType, droidType],\n * });\n * ```\n * @example\n * If an array of `directives` are provided to GraphQLSchema, that will be the\n * exact list of directives represented and allowed. If `directives` is not\n * provided then a default set of the specified directives (e.g. `@include` and\n * `@skip`) will be used. If you wish to provide *additional* directives to\n * these specified directives, you must explicitly declare them.\n *\n * ```ts\n * const MyAppSchema = new GraphQLSchema({\n * query: MyAppQueryRootType,\n * directives: specifiedDirectives.concat([myCustomDirective]),\n * });\n * ```\n */\nexport class GraphQLSchema {\n /**\n * Internal runtime marker used to identify GraphQLSchema instances.\n * @private\n */\n readonly __kind: typeof schemaSymbol = schemaSymbol;\n /** Human-readable description for this schema element, if provided. */\n description: Maybe<string>;\n /** Custom extension fields reserved for users. */\n extensions: Readonly<GraphQLSchemaExtensions>;\n /** AST node from which this schema element was built, if available. */\n astNode: Maybe<SchemaDefinitionNode>;\n /** AST extension nodes applied to this schema element. */\n extensionASTNodes: ReadonlyArray<SchemaExtensionNode>;\n\n /** Whether this schema instance skips validation checks. */\n assumeValid: boolean;\n /**\n * Cached schema validation errors, if validation has already run.\n * @private\n */\n __validationErrors: Maybe<ReadonlyArray<GraphQLError>>;\n\n private _queryType: Maybe<GraphQLObjectType>;\n private _mutationType: Maybe<GraphQLObjectType>;\n private _subscriptionType: Maybe<GraphQLObjectType>;\n private _directives: ReadonlyArray<GraphQLDirective>;\n private _typeMap: TypeMap;\n private _subTypeMap: Map<\n GraphQLAbstractType,\n Set<GraphQLObjectType | GraphQLInterfaceType>\n >;\n\n private _implementationsMap: ObjMap<{\n objects: Array<GraphQLObjectType>;\n interfaces: Array<GraphQLInterfaceType>;\n }>;\n\n /**\n * Creates a GraphQLSchema instance.\n * @param config - Configuration describing this object.\n * @example\n * ```ts\n * // Create a schema with the required query root.\n * import { GraphQLObjectType, GraphQLSchema, GraphQLString } from 'graphql/type';\n *\n * const Query = new GraphQLObjectType({\n * name: 'Query',\n * fields: {\n * greeting: {\n * type: GraphQLString,\n * resolve: () => 'Hello',\n * },\n * },\n * });\n *\n * const schema = new GraphQLSchema({\n * description: 'The application schema.',\n * query: Query,\n * });\n *\n * schema.getQueryType(); // => Query\n * schema.description; // => 'The application schema.'\n * ```\n * @example\n * ```ts\n * // This variant configures every schema option, including directives and extensions.\n * import { DirectiveLocation, parse } from 'graphql/language';\n * import {\n * GraphQLBoolean,\n * GraphQLDirective,\n * GraphQLObjectType,\n * GraphQLSchema,\n * GraphQLString,\n * } from 'graphql/type';\n *\n * const Query = new GraphQLObjectType({\n * name: 'Query',\n * fields: { greeting: { type: GraphQLString } },\n * });\n * const Mutation = new GraphQLObjectType({\n * name: 'Mutation',\n * fields: { setGreeting: { type: GraphQLString } },\n * });\n * const Subscription = new GraphQLObjectType({\n * name: 'Subscription',\n * fields: { greetingChanged: { type: GraphQLString } },\n * });\n * const AuditEvent = new GraphQLObjectType({\n * name: 'AuditEvent',\n * fields: { message: { type: GraphQLString } },\n * });\n * const authDirective = new GraphQLDirective({\n * name: 'auth',\n * locations: [DirectiveLocation.FIELD_DEFINITION],\n * args: { required: { type: GraphQLBoolean } },\n * });\n * const schemaDocument = parse(`\n * schema {\n * query: Query\n * mutation: Mutation\n * subscription: Subscription\n * }\n *\n * extend schema @auth\n * `);\n *\n * const schema = new GraphQLSchema({\n * description: 'Operations exposed by the application.',\n * query: Query,\n * mutation: Mutation,\n * subscription: Subscription,\n * types: [AuditEvent],\n * directives: [authDirective],\n * extensions: { owner: 'platform' },\n * astNode: schemaDocument.definitions[0],\n * extensionASTNodes: [schemaDocument.definitions[1]],\n * assumeValid: true,\n * });\n *\n * schema.getMutationType(); // => Mutation\n * schema.getSubscriptionType(); // => Subscription\n * schema.getType('AuditEvent'); // => AuditEvent\n * schema.getDirective('auth'); // => authDirective\n * schema.extensions; // => { owner: 'platform' }\n * ```\n */\n constructor(config: Readonly<GraphQLSchemaConfig>) {\n // If this schema was built from a source known to be valid, then it may be\n // marked with assumeValid to avoid an additional type system validation.\n this.assumeValid = config.assumeValid ?? false;\n // Used as a cache for validateSchema().\n this.__validationErrors = config.assumeValid === true ? [] : undefined;\n\n this.description = config.description;\n this.extensions = toObjMapWithSymbols(config.extensions);\n this.astNode = config.astNode;\n this.extensionASTNodes = config.extensionASTNodes ?? [];\n\n this._queryType = config.query;\n this._mutationType = config.mutation;\n this._subscriptionType = config.subscription;\n // Provide specified directives (e.g. @include and @skip) by default.\n this._directives = config.directives ?? specifiedDirectives;\n\n // To preserve order of user-provided types, we add first to add them to\n // the set of \"collected\" types, so `collectReferencedTypes` ignore them.\n const allReferencedTypes = new Set<GraphQLNamedType>(config.types);\n if (config.types != null) {\n for (const type of config.types) {\n // When we ready to process this type, we remove it from \"collected\" types\n // and then add it together with all dependent types in the correct position.\n allReferencedTypes.delete(type);\n collectReferencedTypes(type, allReferencedTypes);\n }\n }\n\n if (this._queryType != null) {\n collectReferencedTypes(this._queryType, allReferencedTypes);\n }\n if (this._mutationType != null) {\n collectReferencedTypes(this._mutationType, allReferencedTypes);\n }\n if (this._subscriptionType != null) {\n collectReferencedTypes(this._subscriptionType, allReferencedTypes);\n }\n\n for (const directive of this._directives) {\n // Directives are not validated until validateSchema() is called.\n if (isDirective(directive)) {\n for (const arg of directive.args) {\n collectReferencedTypes(arg.type, allReferencedTypes);\n }\n }\n }\n collectReferencedTypes(__Schema, allReferencedTypes);\n\n // Storing the resulting map for reference by the schema.\n this._typeMap = Object.create(null);\n this._subTypeMap = new Map();\n // Keep track of all implementations by interface name.\n this._implementationsMap = Object.create(null);\n\n for (const namedType of allReferencedTypes) {\n if (namedType == null) {\n continue;\n }\n\n const typeName = namedType.name;\n if (this._typeMap[typeName] !== undefined) {\n throw new Error(\n `Schema must contain uniquely named types but contains multiple types named \"${typeName}\".`,\n );\n }\n this._typeMap[typeName] = namedType;\n\n if (isInterfaceType(namedType)) {\n // Store implementations by interface.\n for (const iface of namedType.getInterfaces()) {\n if (isInterfaceType(iface)) {\n let implementations = this._implementationsMap[iface.name];\n implementations ??= this._implementationsMap[iface.name] = {\n objects: [],\n interfaces: [],\n };\n\n implementations.interfaces.push(namedType);\n }\n }\n } else if (isObjectType(namedType)) {\n // Store implementations by objects.\n for (const iface of namedType.getInterfaces()) {\n if (isInterfaceType(iface)) {\n let implementations = this._implementationsMap[iface.name];\n implementations ??= this._implementationsMap[iface.name] = {\n objects: [],\n interfaces: [],\n };\n\n implementations.objects.push(namedType);\n }\n }\n }\n }\n }\n\n /**\n * Returns the value used by `Object.prototype.toString`.\n * @returns The built-in string tag for this object.\n */\n get [Symbol.toStringTag](): string {\n return 'GraphQLSchema';\n }\n\n /**\n * Returns the root object type for query operations.\n * @returns The query root type, if this schema defines one.\n * @example\n * ```ts\n * import { buildSchema } from 'graphql/utilities';\n *\n * const schema = buildSchema(`\n * type Query {\n * greeting: String\n * }\n * `);\n *\n * schema.getQueryType()?.name; // => 'Query'\n * ```\n */\n getQueryType(): Maybe<GraphQLObjectType> {\n return this._queryType;\n }\n\n /**\n * Returns the root object type for mutation operations.\n * @returns The mutation root type, if this schema defines one.\n * @example\n * ```ts\n * import { buildSchema } from 'graphql/utilities';\n *\n * const schema = buildSchema(`\n * type Query {\n * greeting: String\n * }\n *\n * type Mutation {\n * setGreeting(value: String!): String\n * }\n * `);\n *\n * schema.getMutationType()?.name; // => 'Mutation'\n * ```\n */\n getMutationType(): Maybe<GraphQLObjectType> {\n return this._mutationType;\n }\n\n /**\n * Returns the root object type for subscription operations.\n * @returns The subscription root type, if this schema defines one.\n * @example\n * ```ts\n * import { buildSchema } from 'graphql/utilities';\n *\n * const schema = buildSchema(`\n * type Query {\n * greeting: String\n * }\n *\n * type Subscription {\n * greetings: String\n * }\n * `);\n *\n * schema.getSubscriptionType()?.name; // => 'Subscription'\n * ```\n */\n getSubscriptionType(): Maybe<GraphQLObjectType> {\n return this._subscriptionType;\n }\n\n /**\n * Returns the root object type for the requested operation kind.\n * @param operation - Operation kind to resolve.\n * @returns The root object type for the operation kind, if this schema defines one.\n * @example\n * ```ts\n * import { OperationTypeNode } from 'graphql/language';\n * import { buildSchema } from 'graphql/utilities';\n *\n * const schema = buildSchema(`\n * type Query {\n * greeting: String\n * }\n *\n * type Mutation {\n * setGreeting(value: String!): String\n * }\n * `);\n *\n * schema.getRootType(OperationTypeNode.QUERY)?.name; // => 'Query'\n * schema.getRootType(OperationTypeNode.MUTATION)?.name; // => 'Mutation'\n * schema.getRootType(OperationTypeNode.SUBSCRIPTION); // => undefined\n * ```\n */\n getRootType(operation: OperationTypeNode): Maybe<GraphQLObjectType> {\n switch (operation) {\n case OperationTypeNode.QUERY:\n return this.getQueryType();\n case OperationTypeNode.MUTATION:\n return this.getMutationType();\n case OperationTypeNode.SUBSCRIPTION:\n return this.getSubscriptionType();\n }\n }\n\n /**\n * Returns all named types known to this schema.\n * @returns A map of schema types keyed by type name.\n * @example\n * ```ts\n * import { buildSchema } from 'graphql/utilities';\n *\n * const schema = buildSchema(`\n * type User {\n * name: String\n * }\n *\n * type Query {\n * viewer: User\n * }\n * `);\n *\n * const typeMap = schema.getTypeMap();\n *\n * typeMap.User.name; // => 'User'\n * typeMap.Query.name; // => 'Query'\n * typeMap.String.name; // => 'String'\n * ```\n */\n getTypeMap(): TypeMap {\n return this._typeMap;\n }\n\n /**\n * Returns the named type with the provided name.\n * @param name - The GraphQL name to look up.\n * @returns The named schema type, if one exists.\n * @example\n * ```ts\n * import { buildSchema } from 'graphql/utilities';\n *\n * const schema = buildSchema(`\n * type User {\n * name: String\n * }\n *\n * type Query {\n * viewer: User\n * }\n * `);\n *\n * schema.getType('User')?.toString(); // => 'User'\n * schema.getType('Missing'); // => undefined\n * ```\n */\n getType(name: string): GraphQLNamedType | undefined {\n return this.getTypeMap()[name];\n }\n\n /**\n * Returns object types that may be returned for an abstract type.\n * @param abstractType - Interface or union type to inspect.\n * @returns Object types that may satisfy the abstract type.\n * @example\n * ```ts\n * import { buildSchema } from 'graphql/utilities';\n * import { assertInterfaceType, assertUnionType } from 'graphql/type';\n *\n * const schema = buildSchema(`\n * interface Node {\n * id: ID!\n * }\n *\n * type User implements Node {\n * id: ID!\n * }\n *\n * type Organization implements Node {\n * id: ID!\n * }\n *\n * union SearchResult = User | Organization\n *\n * type Query {\n * node: Node\n * search: [SearchResult]\n * }\n * `);\n *\n * const Node = assertInterfaceType(schema.getType('Node'));\n * const SearchResult = assertUnionType(schema.getType('SearchResult'));\n *\n * schema.getPossibleTypes(Node).map((type) => type.name); // => ['User', 'Organization']\n * schema.getPossibleTypes(SearchResult).map((type) => type.name); // => ['User', 'Organization']\n * ```\n */\n getPossibleTypes(\n abstractType: GraphQLAbstractType,\n ): ReadonlyArray<GraphQLObjectType> {\n return isUnionType(abstractType)\n ? abstractType.getTypes()\n : this.getImplementations(abstractType).objects;\n }\n\n /**\n * Returns objects and interfaces that implement an interface type.\n * @param interfaceType - Interface type to inspect.\n * @returns Object and interface implementations of the interface.\n * @example\n * ```ts\n * import { buildSchema } from 'graphql/utilities';\n * import { assertInterfaceType } from 'graphql/type';\n *\n * const schema = buildSchema(`\n * interface Resource {\n * url: String!\n * }\n *\n * interface Image implements Resource {\n * url: String!\n * width: Int\n * }\n *\n * type Photo implements Resource & Image {\n * url: String!\n * width: Int\n * }\n *\n * type Query {\n * resource: Resource\n * }\n * `);\n *\n * const Resource = assertInterfaceType(schema.getType('Resource'));\n * const implementations = schema.getImplementations(Resource);\n *\n * implementations.interfaces.map((type) => type.name); // => ['Image']\n * implementations.objects.map((type) => type.name); // => ['Photo']\n * ```\n */\n getImplementations(interfaceType: GraphQLInterfaceType): {\n objects: ReadonlyArray<GraphQLObjectType>;\n interfaces: ReadonlyArray<GraphQLInterfaceType>;\n } {\n const implementations = this._implementationsMap[interfaceType.name];\n return implementations ?? { objects: [], interfaces: [] };\n }\n\n /**\n * Returns whether one type is a possible runtime subtype of an abstract type.\n * @param abstractType - Interface or union type to inspect.\n * @param maybeSubType - Object or interface type to test as a possible subtype.\n * @returns True when the subtype may satisfy the abstract type.\n * @example\n * ```ts\n * import { buildSchema } from 'graphql/utilities';\n * import { assertInterfaceType, assertObjectType } from 'graphql/type';\n *\n * const schema = buildSchema(`\n * interface Node {\n * id: ID!\n * }\n *\n * type User implements Node {\n * id: ID!\n * }\n *\n * type Review {\n * body: String\n * }\n *\n * type Query {\n * node: Node\n * review: Review\n * }\n * `);\n *\n * const Node = assertInterfaceType(schema.getType('Node'));\n * const User = assertObjectType(schema.getType('User'));\n * const Review = assertObjectType(schema.getType('Review'));\n *\n * schema.isSubType(Node, User); // => true\n * schema.isSubType(Node, Review); // => false\n * ```\n */\n isSubType(\n abstractType: GraphQLAbstractType,\n maybeSubType: GraphQLObjectType | GraphQLInterfaceType,\n ): boolean {\n let set = this._subTypeMap.get(abstractType);\n if (set === undefined) {\n if (isUnionType(abstractType)) {\n set = new Set<GraphQLObjectType>(abstractType.getTypes());\n } else {\n const implementations = this.getImplementations(abstractType);\n set = new Set<GraphQLObjectType | GraphQLInterfaceType>([\n ...implementations.objects,\n ...implementations.interfaces,\n ]);\n }\n\n this._subTypeMap.set(abstractType, set);\n }\n return set.has(maybeSubType);\n }\n\n /**\n * Returns directives available in this schema.\n * @returns Directives available in this schema.\n * @example\n * ```ts\n * import { buildSchema } from 'graphql/utilities';\n *\n * const schema = buildSchema(`\n * directive @upper on FIELD_DEFINITION\n *\n * type Query {\n * greeting: String @upper\n * }\n * `);\n *\n * schema.getDirectives().map((directive) => directive.name); // => ['include', 'skip', 'deprecated', 'specifiedBy', 'oneOf', 'upper']\n * ```\n */\n getDirectives(): ReadonlyArray<GraphQLDirective> {\n return this._directives;\n }\n\n /**\n * Returns the current directive definition.\n * @param name - The GraphQL name to look up.\n * @returns The current directive definition, if known.\n * @example\n * ```ts\n * import { buildSchema } from 'graphql/utilities';\n *\n * const schema = buildSchema(`\n * directive @upper on FIELD_DEFINITION\n *\n * type Query {\n * greeting: String @upper\n * }\n * `);\n *\n * schema.getDirective('upper')?.name; // => 'upper'\n * schema.getDirective('missing'); // => undefined\n * ```\n */\n getDirective(name: string): Maybe<GraphQLDirective> {\n return this.getDirectives().find((directive) => directive.name === name);\n }\n\n /**\n * This method looks up the field on the given type definition.\n * It has special casing for the three introspection fields, `__schema`,\n * `__type` and `__typename`.\n *\n * `__typename` is special because it can always be queried as a field, even\n * in situations where no other fields are allowed, like on a Union.\n *\n * `__schema` and `__type` could get automatically added to the query type,\n * but that would require mutating type definitions, which would cause issues.\n * @param parentType - Composite type to look up the field on.\n * @param fieldName - Field name to look up.\n * @returns The field definition, including supported introspection fields.\n * @example\n * ```ts\n * import { buildSchema } from 'graphql/utilities';\n *\n * const schema = buildSchema(`\n * type Query {\n * greeting: String\n * }\n * `);\n * const queryType = schema.getQueryType();\n *\n * schema.getField(queryType, 'greeting')?.name; // => 'greeting'\n * schema.getField(queryType, '__typename')?.name; // => '__typename'\n * schema.getField(queryType, 'missing'); // => undefined\n * ```\n */\n getField(\n parentType: GraphQLCompositeType,\n fieldName: string,\n ): GraphQLField<unknown, unknown> | undefined {\n switch (fieldName) {\n case SchemaMetaFieldDef.name:\n return this.getQueryType() === parentType\n ? SchemaMetaFieldDef\n : undefined;\n case TypeMetaFieldDef.name:\n return this.getQueryType() === parentType\n ? TypeMetaFieldDef\n : undefined;\n case TypeNameMetaFieldDef.name:\n return TypeNameMetaFieldDef;\n }\n\n // this function is part \"hot\" path inside executor and check presence\n // of 'getFields' is faster than to use `!isUnionType`\n if ('getFields' in parentType) {\n return parentType.getFields()[fieldName];\n }\n return undefined;\n }\n\n /**\n * Returns a normalized configuration object for this object.\n *\n * The returned config preserves the original `assumeValid` flag so the schema\n * can be recreated with the same validation behavior.\n * @returns A configuration object that can be used to recreate this object.\n * @example\n * ```ts\n * import { buildSchema } from 'graphql/utilities';\n * import { GraphQLSchema } from 'graphql/type';\n *\n * const schema = buildSchema(`\n * type Query {\n * greeting: String\n * }\n * `);\n *\n * const config = schema.toConfig();\n * const schemaCopy = new GraphQLSchema(config);\n *\n * config.query?.name; // => 'Query'\n * schemaCopy.getQueryType()?.name; // => 'Query'\n * ```\n */\n toConfig(): GraphQLSchemaNormalizedConfig {\n return {\n description: this.description,\n query: this.getQueryType(),\n mutation: this.getMutationType(),\n subscription: this.getSubscriptionType(),\n types: Object.values(this.getTypeMap()),\n directives: this.getDirectives(),\n extensions: this.extensions,\n astNode: this.astNode,\n extensionASTNodes: this.extensionASTNodes,\n assumeValid: this.assumeValid,\n };\n }\n}\n\ntype TypeMap = ObjMap<GraphQLNamedType>;\n\n/** @internal */\nexport interface GraphQLSchemaValidationOptions {\n /**\n * When building a schema from a GraphQL service's introspection result, it\n * might be safe to assume the schema is valid. Set to true to assume the\n * produced schema is valid.\n *\n * Default: false\n *\n * @internal\n */\n assumeValid?: boolean | undefined;\n}\n\n/** Configuration used to construct a GraphQLSchema. */\nexport interface GraphQLSchemaConfig extends GraphQLSchemaValidationOptions {\n /** Human-readable description for this schema element, if provided. */\n description?: Maybe<string>;\n /** Root object type for query operations. */\n query?: Maybe<GraphQLObjectType>;\n /** Root object type for mutation operations. */\n mutation?: Maybe<GraphQLObjectType>;\n /** Root object type for subscription operations. */\n subscription?: Maybe<GraphQLObjectType>;\n /** Object types that belong to this union type. */\n types?: Maybe<ReadonlyArray<GraphQLNamedType>>;\n /** Directives available in this schema or applied to this AST node. */\n directives?: Maybe<ReadonlyArray<GraphQLDirective>>;\n /** Custom extension fields reserved for users. */\n extensions?: Maybe<Readonly<GraphQLSchemaExtensions>>;\n /** AST node from which this schema element was built, if available. */\n astNode?: Maybe<SchemaDefinitionNode>;\n /** AST extension nodes applied to this schema element. */\n extensionASTNodes?: Maybe<ReadonlyArray<SchemaExtensionNode>>;\n}\n\n/** @internal */\nexport interface GraphQLSchemaNormalizedConfig extends GraphQLSchemaConfig {\n description: Maybe<string>;\n types: ReadonlyArray<GraphQLNamedType>;\n directives: ReadonlyArray<GraphQLDirective>;\n extensions: Readonly<GraphQLSchemaExtensions>;\n extensionASTNodes: ReadonlyArray<SchemaExtensionNode>;\n assumeValid: boolean;\n}\n\nfunction collectReferencedTypes(\n type: GraphQLType,\n typeSet: Set<GraphQLNamedType>,\n): Set<GraphQLNamedType> {\n const namedType = getNamedType(type);\n\n if (!typeSet.has(namedType)) {\n typeSet.add(namedType);\n if (isUnionType(namedType)) {\n for (const memberType of namedType.getTypes()) {\n collectReferencedTypes(memberType, typeSet);\n }\n } else if (isObjectType(namedType) || isInterfaceType(namedType)) {\n for (const interfaceType of namedType.getInterfaces()) {\n collectReferencedTypes(interfaceType, typeSet);\n }\n\n for (const field of Object.values(namedType.getFields())) {\n collectReferencedTypes(field.type, typeSet);\n for (const arg of field.args) {\n collectReferencedTypes(arg.type, typeSet);\n }\n }\n } else if (isInputObjectType(namedType)) {\n for (const field of Object.values(namedType.getFields())) {\n collectReferencedTypes(field.type, typeSet);\n }\n }\n }\n\n return typeSet;\n}\n"]}