graphql
Version:
A Query Language and Runtime which can target any service.
1 lines • 19.3 kB
Source Map (JSON)
{"version":3,"file":"printSchema.js","sourceRoot":"","sources":["../../src/utilities/printSchema.ts"],"names":[],"mappings":"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","sourcesContent":["/** @category Schema Printing */\n\nimport { inspect } from '../jsutils/inspect.ts';\nimport { invariant } from '../jsutils/invariant.ts';\nimport type { Maybe } from '../jsutils/Maybe.ts';\n\nimport { isPrintableAsBlockString } from '../language/blockString.ts';\nimport { Kind } from '../language/kinds.ts';\nimport { print } from '../language/printer.ts';\n\nimport type {\n GraphQLArgument,\n GraphQLEnumType,\n GraphQLInputField,\n GraphQLInputObjectType,\n GraphQLInterfaceType,\n GraphQLNamedType,\n GraphQLObjectType,\n GraphQLScalarType,\n GraphQLUnionType,\n} from '../type/definition.ts';\nimport {\n isEnumType,\n isInputObjectType,\n isInterfaceType,\n isObjectType,\n isScalarType,\n isUnionType,\n} from '../type/definition.ts';\nimport type { GraphQLDirective } from '../type/directives.ts';\nimport {\n DEFAULT_DEPRECATION_REASON,\n isSpecifiedDirective,\n} from '../type/directives.ts';\nimport { isIntrospectionType } from '../type/introspection.ts';\nimport { isSpecifiedScalarType } from '../type/scalars.ts';\nimport type { GraphQLSchema } from '../type/schema.ts';\n\nimport { getDefaultValueAST } from './getDefaultValueAST.ts';\n\n/**\n * Prints the schema.\n * @param schema - GraphQL schema to use.\n * @returns The printed string representation.\n * @example\n * ```ts\n * import { buildSchema, printSchema } 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 * printSchema(schema); // => ['directive @upper on FIELD_DEFINITION', '', 'type Query {', ' greeting: String', '}'].join('\\n')\n * ```\n */\nexport function printSchema(schema: GraphQLSchema): string {\n return printFilteredSchema(\n schema,\n (n) => !isSpecifiedDirective(n),\n isDefinedType,\n );\n}\n\n/**\n * Prints the introspection schema.\n * @param schema - GraphQL schema to use.\n * @returns The printed string representation.\n * @example\n * ```ts\n * import { buildSchema, printIntrospectionSchema } from 'graphql/utilities';\n *\n * const schema = buildSchema(`\n * type Query {\n * greeting: String\n * }\n * `);\n *\n * const printed = printIntrospectionSchema(schema);\n *\n * printed; // matches /type __Schema/\n * printed; // matches /enum __TypeKind/\n * printed; // does not match /type Query/\n * ```\n */\nexport function printIntrospectionSchema(schema: GraphQLSchema): string {\n return printFilteredSchema(schema, isSpecifiedDirective, isIntrospectionType);\n}\n\nfunction isDefinedType(type: GraphQLNamedType): boolean {\n return !isSpecifiedScalarType(type) && !isIntrospectionType(type);\n}\n\nfunction printFilteredSchema(\n schema: GraphQLSchema,\n directiveFilter: (type: GraphQLDirective) => boolean,\n typeFilter: (type: GraphQLNamedType) => boolean,\n): string {\n const directives = schema.getDirectives().filter(directiveFilter);\n const types = Object.values(schema.getTypeMap()).filter(typeFilter);\n\n return [\n printSchemaDefinition(schema),\n ...directives.map((directive) => printDirective(directive)),\n ...types.map((type) => printType(type)),\n ]\n .filter(Boolean)\n .join('\\n\\n');\n}\n\nfunction printSchemaDefinition(schema: GraphQLSchema): Maybe<string> {\n const queryType = schema.getQueryType();\n const mutationType = schema.getMutationType();\n const subscriptionType = schema.getSubscriptionType();\n\n // Special case: When a schema has no root operation types, no valid schema\n // definition can be printed.\n if (!queryType && !mutationType && !subscriptionType) {\n return;\n }\n\n // Only print a schema definition if there is a description or if it should\n // not be omitted because of having default type names.\n if (schema.description != null || !hasDefaultRootOperationTypes(schema)) {\n return (\n printDescription(schema) +\n 'schema {\\n' +\n (queryType ? ` query: ${queryType}\\n` : '') +\n (mutationType ? ` mutation: ${mutationType}\\n` : '') +\n (subscriptionType ? ` subscription: ${subscriptionType}\\n` : '') +\n '}'\n );\n }\n}\n\n/**\n * GraphQL schema define root types for each type of operation. These types are\n * the same as any other type and can be named in any manner, however there is\n * a common naming convention:\n *\n * ```graphql\n * schema {\n * query: Query\n * mutation: Mutation\n * subscription: Subscription\n * }\n * ```\n *\n * When using this naming convention, the schema description can be omitted so\n * long as these names are only used for operation types.\n *\n * Note however that if any of these default names are used elsewhere in the\n * schema but not as a root operation type, the schema definition must still\n * be printed to avoid ambiguity.\n *\n * @internal\n */\nfunction hasDefaultRootOperationTypes(schema: GraphQLSchema): boolean {\n /* eslint-disable eqeqeq */\n return (\n schema.getQueryType() == schema.getType('Query') &&\n schema.getMutationType() == schema.getType('Mutation') &&\n schema.getSubscriptionType() == schema.getType('Subscription')\n );\n}\n\n/**\n * Prints the type.\n * @param type - The GraphQL type to inspect.\n * @returns The printed string representation.\n * @example\n * ```ts\n * import { buildSchema, printType } from 'graphql/utilities';\n *\n * const schema = buildSchema(`\n * type User {\n * id: ID!\n * name: String\n * }\n *\n * type Query {\n * viewer: User\n * }\n * `);\n *\n * printType(schema.getType('User')); // => ['type User {', ' id: ID!', ' name: String', '}'].join('\\n')\n * ```\n */\nexport function printType(type: GraphQLNamedType): string {\n if (isScalarType(type)) {\n return printScalar(type);\n }\n if (isObjectType(type)) {\n return printObject(type);\n }\n if (isInterfaceType(type)) {\n return printInterface(type);\n }\n if (isUnionType(type)) {\n return printUnion(type);\n }\n if (isEnumType(type)) {\n return printEnum(type);\n }\n if (isInputObjectType(type)) {\n return printInputObject(type);\n /* node:coverage ignore next 4 */\n }\n // Not reachable, all possible types have been considered.\n invariant(false, 'Unexpected type: ' + inspect(type));\n}\n\nfunction printScalar(type: GraphQLScalarType): string {\n return printDescription(type) + `scalar ${type}` + printSpecifiedByURL(type);\n}\n\nfunction printImplementedInterfaces(\n type: GraphQLObjectType | GraphQLInterfaceType,\n): string {\n const interfaces = type.getInterfaces();\n return interfaces.length\n ? ' implements ' + interfaces.map((i) => i.name).join(' & ')\n : '';\n}\n\nfunction printObject(type: GraphQLObjectType): string {\n return (\n printDescription(type) +\n `type ${type}` +\n printImplementedInterfaces(type) +\n printFields(type)\n );\n}\n\nfunction printInterface(type: GraphQLInterfaceType): string {\n return (\n printDescription(type) +\n `interface ${type}` +\n printImplementedInterfaces(type) +\n printFields(type)\n );\n}\n\nfunction printUnion(type: GraphQLUnionType): string {\n const types = type.getTypes();\n const possibleTypes = types.length ? ' = ' + types.join(' | ') : '';\n return printDescription(type) + `union ${type.name}` + possibleTypes;\n}\n\nfunction printEnum(type: GraphQLEnumType): string {\n const values = type\n .getValues()\n .map(\n (value, i) =>\n printDescription(value, ' ', !i) +\n ' ' +\n value.name +\n printDeprecated(value.deprecationReason),\n );\n\n return printDescription(type) + `enum ${type}` + printBlock(values);\n}\n\nfunction printInputObject(type: GraphQLInputObjectType): string {\n const fields = Object.values(type.getFields()).map(\n (f, i) => printDescription(f, ' ', !i) + ' ' + printInputValue(f),\n );\n return (\n printDescription(type) +\n `input ${type}` +\n (type.isOneOf ? ' @oneOf' : '') +\n printBlock(fields)\n );\n}\n\nfunction printFields(type: GraphQLObjectType | GraphQLInterfaceType): string {\n const fields = Object.values(type.getFields()).map(\n (f, i) =>\n printDescription(f, ' ', !i) +\n ' ' +\n f.name +\n printArgs(f.args, ' ') +\n ': ' +\n String(f.type) +\n printDeprecated(f.deprecationReason),\n );\n return printBlock(fields);\n}\n\nfunction printBlock(items: ReadonlyArray<string>): string {\n return items.length !== 0 ? ' {\\n' + items.join('\\n') + '\\n}' : '';\n}\n\nfunction printArgs(\n args: ReadonlyArray<GraphQLArgument>,\n indentation: string = '',\n): string {\n if (args.length === 0) {\n return '';\n }\n\n // If every arg does not have a description, print them on one line.\n if (args.every((arg) => arg.description == null)) {\n return '(' + args.map(printInputValue).join(', ') + ')';\n }\n\n return (\n '(\\n' +\n args\n .map(\n (arg, i) =>\n printDescription(arg, ' ' + indentation, !i) +\n ' ' +\n indentation +\n printInputValue(arg),\n )\n .join('\\n') +\n '\\n' +\n indentation +\n ')'\n );\n}\n\nfunction printInputValue(\n argOrInputField: GraphQLArgument | GraphQLInputField,\n): string {\n let argDecl = argOrInputField.name + ': ' + String(argOrInputField.type);\n const defaultValueAST = getDefaultValueAST(argOrInputField);\n if (defaultValueAST) {\n argDecl += ` = ${print(defaultValueAST)}`;\n }\n return argDecl + printDeprecated(argOrInputField.deprecationReason);\n}\n\n/**\n * Prints a directive definition in GraphQL SDL.\n * @param directive - Directive to print.\n * @returns SDL string for the directive definition.\n * @example\n * ```ts\n * import {\n * DirectiveLocation,\n * GraphQLDirective,\n * GraphQLString,\n * } from 'graphql/type';\n * import { printDirective } from 'graphql/utilities';\n *\n * const authDirective = new GraphQLDirective({\n * name: 'auth',\n * description: 'Requires authorization.',\n * locations: [DirectiveLocation.FIELD_DEFINITION],\n * args: {\n * scope: { type: GraphQLString },\n * },\n * });\n *\n * printDirective(authDirective); // => '\"\"\"Requires authorization.\"\"\"\\ndirective @auth(scope: String) on FIELD_DEFINITION'\n * ```\n */\nexport function printDirective(directive: GraphQLDirective): string {\n return (\n printDescription(directive) +\n `directive ${directive}` +\n printArgs(directive.args) +\n printDeprecated(directive.deprecationReason) +\n (directive.isRepeatable ? ' repeatable' : '') +\n ' on ' +\n directive.locations.join(' | ')\n );\n}\n\nfunction printDeprecated(reason: Maybe<string>): string {\n if (reason == null) {\n return '';\n }\n if (reason !== DEFAULT_DEPRECATION_REASON) {\n const astValue = print({ kind: Kind.STRING, value: reason });\n return ` @deprecated(reason: ${astValue})`;\n }\n return ' @deprecated';\n}\n\nfunction printSpecifiedByURL(scalar: GraphQLScalarType): string {\n if (scalar.specifiedByURL == null) {\n return '';\n }\n const astValue = print({\n kind: Kind.STRING,\n value: scalar.specifiedByURL,\n });\n return ` @specifiedBy(url: ${astValue})`;\n}\n\nfunction printDescription(\n def: { readonly description: Maybe<string> },\n indentation: string = '',\n firstInBlock: boolean = true,\n): string {\n const { description } = def;\n if (description == null) {\n return '';\n }\n\n const blockString = print({\n kind: Kind.STRING,\n value: description,\n block: isPrintableAsBlockString(description),\n });\n\n const prefix =\n indentation && !firstInBlock ? '\\n' + indentation : indentation;\n\n return prefix + blockString.replaceAll('\\n', '\\n' + indentation) + '\\n';\n}\n"]}