{"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"]}