{"version":3,"file":"resolveSchemaCoordinate.js","sourceRoot":"","sources":["../../src/utilities/resolveSchemaCoordinate.ts"],"names":[],"mappings":"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","sourcesContent":["/** @category Schema Coordinates */\n\nimport { inspect } from '../jsutils/inspect.ts';\n\nimport type {\n  ArgumentCoordinateNode,\n  DirectiveArgumentCoordinateNode,\n  DirectiveCoordinateNode,\n  MemberCoordinateNode,\n  SchemaCoordinateNode,\n  TypeCoordinateNode,\n} from '../language/ast.ts';\nimport { Kind } from '../language/kinds.ts';\nimport { parseSchemaCoordinate } from '../language/parser.ts';\nimport type { Source } from '../language/source.ts';\n\nimport type {\n  GraphQLArgument,\n  GraphQLEnumType,\n  GraphQLEnumValue,\n  GraphQLField,\n  GraphQLInputField,\n  GraphQLInputObjectType,\n  GraphQLInterfaceType,\n  GraphQLNamedType,\n  GraphQLObjectType,\n} from '../type/definition.ts';\nimport {\n  isEnumType,\n  isInputObjectType,\n  isInterfaceType,\n  isObjectType,\n} from '../type/definition.ts';\nimport type { GraphQLDirective } from '../type/directives.ts';\nimport type { GraphQLSchema } from '../type/schema.ts';\n\n/**\n * A resolved schema element may be one of the following kinds:\n *\n * @internal\n */\nexport interface ResolvedNamedType {\n  readonly kind: 'NamedType';\n  readonly type: GraphQLNamedType;\n}\n\n/** @internal */\nexport interface ResolvedField {\n  readonly kind: 'Field';\n  readonly type: GraphQLObjectType | GraphQLInterfaceType;\n  readonly field: GraphQLField<unknown, unknown>;\n}\n\n/** @internal */\nexport interface ResolvedInputField {\n  readonly kind: 'InputField';\n  readonly type: GraphQLInputObjectType;\n  readonly inputField: GraphQLInputField;\n}\n\n/** @internal */\nexport interface ResolvedEnumValue {\n  readonly kind: 'EnumValue';\n  readonly type: GraphQLEnumType;\n  readonly enumValue: GraphQLEnumValue;\n}\n\n/** @internal */\nexport interface ResolvedFieldArgument {\n  readonly kind: 'FieldArgument';\n  readonly type: GraphQLObjectType | GraphQLInterfaceType;\n  readonly field: GraphQLField<unknown, unknown>;\n  readonly fieldArgument: GraphQLArgument;\n}\n\n/** @internal */\nexport interface ResolvedDirective {\n  readonly kind: 'Directive';\n  readonly directive: GraphQLDirective;\n}\n\n/** @internal */\nexport interface ResolvedDirectiveArgument {\n  readonly kind: 'DirectiveArgument';\n  readonly directive: GraphQLDirective;\n  readonly directiveArgument: GraphQLArgument;\n}\n\n/** A schema element resolved from a schema coordinate. */\nexport type ResolvedSchemaElement =\n  | ResolvedNamedType\n  | ResolvedField\n  | ResolvedInputField\n  | ResolvedEnumValue\n  | ResolvedFieldArgument\n  | ResolvedDirective\n  | ResolvedDirectiveArgument;\n\n/**\n * A schema coordinate is resolved in the context of a GraphQL schema to\n * uniquely identify a schema element. It returns undefined if the schema\n * coordinate does not resolve to a schema element, meta-field, or introspection\n * schema element. It will throw if the containing schema element (if\n * applicable) does not exist.\n *\n * https://spec.graphql.org/draft/#sec-Schema-Coordinates.Semantics\n * @param schema - GraphQL schema to use.\n * @param schemaCoordinate - The schema coordinate to resolve.\n * @returns The schema element identified by the coordinate, or undefined if none exists.\n * @example\n * ```ts\n * import { buildSchema, resolveSchemaCoordinate } from 'graphql/utilities';\n *\n * const schema = buildSchema(`\n *   directive @tag(name: String!) on FIELD_DEFINITION\n *\n *   input ReviewInput {\n *     stars: Int!\n *   }\n *\n *   enum Episode {\n *     NEW_HOPE\n *   }\n *\n *   type Query {\n *     reviews(input: ReviewInput): [String] @tag(name: \"reviews\")\n *   }\n * `);\n *\n * resolveSchemaCoordinate(schema, 'Query').kind; // => 'NamedType'\n * resolveSchemaCoordinate(schema, 'Query.reviews').kind; // => 'Field'\n * resolveSchemaCoordinate(schema, 'Query.reviews(input:)').kind; // => 'FieldArgument'\n * resolveSchemaCoordinate(schema, 'ReviewInput.stars').kind; // => 'InputField'\n * resolveSchemaCoordinate(schema, 'Episode.NEW_HOPE').kind; // => 'EnumValue'\n * resolveSchemaCoordinate(schema, '@tag').kind; // => 'Directive'\n * resolveSchemaCoordinate(schema, '@tag(name:)').kind; // => 'DirectiveArgument'\n * resolveSchemaCoordinate(schema, 'Query.missing'); // => undefined\n * ```\n */\nexport function resolveSchemaCoordinate(\n  schema: GraphQLSchema,\n  schemaCoordinate: string | Source,\n): ResolvedSchemaElement | undefined {\n  return resolveASTSchemaCoordinate(\n    schema,\n    parseSchemaCoordinate(schemaCoordinate),\n  );\n}\n\n/**\n * TypeCoordinate : Name\n *\n * @internal\n */\nfunction resolveTypeCoordinate(\n  schema: GraphQLSchema,\n  schemaCoordinate: TypeCoordinateNode,\n): ResolvedNamedType | undefined {\n  // 1. Let {typeName} be the value of {Name}.\n  const typeName = schemaCoordinate.name.value;\n  const type = schema.getType(typeName);\n\n  // 2. Return the type in the {schema} named {typeName} if it exists.\n  if (type == null) {\n    return;\n  }\n\n  return { kind: 'NamedType', type };\n}\n\n/**\n * MemberCoordinate : Name . Name\n *\n * @internal\n */\nfunction resolveMemberCoordinate(\n  schema: GraphQLSchema,\n  schemaCoordinate: MemberCoordinateNode,\n): ResolvedField | ResolvedInputField | ResolvedEnumValue | undefined {\n  // 1. Let {typeName} be the value of the first {Name}.\n  // 2. Let {type} be the type in the {schema} named {typeName}.\n  const typeName = schemaCoordinate.name.value;\n  const type = schema.getType(typeName);\n\n  // 3. Assert: {type} must exist, and must be an Enum, Input Object, Object or Interface type.\n  if (!type) {\n    throw new Error(\n      `Expected ${inspect(typeName)} to be defined as a type in the schema.`,\n    );\n  }\n  if (\n    !isEnumType(type) &&\n    !isInputObjectType(type) &&\n    !isObjectType(type) &&\n    !isInterfaceType(type)\n  ) {\n    throw new Error(\n      `Expected ${inspect(typeName)} to be an Enum, Input Object, Object or Interface type.`,\n    );\n  }\n\n  // 4. If {type} is an Enum type:\n  if (isEnumType(type)) {\n    // 1. Let {enumValueName} be the value of the second {Name}.\n    const enumValueName = schemaCoordinate.memberName.value;\n    const enumValue = type.getValue(enumValueName);\n\n    // 2. Return the enum value of {type} named {enumValueName} if it exists.\n    if (enumValue == null) {\n      return;\n    }\n\n    return { kind: 'EnumValue', type, enumValue };\n  }\n\n  // 5. Otherwise, if {type} is an Input Object type:\n  if (isInputObjectType(type)) {\n    // 1. Let {inputFieldName} be the value of the second {Name}.\n    const inputFieldName = schemaCoordinate.memberName.value;\n    const inputField = type.getFields()[inputFieldName];\n\n    // 2. Return the input field of {type} named {inputFieldName} if it exists.\n    if (inputField == null) {\n      return;\n    }\n\n    return { kind: 'InputField', type, inputField };\n  }\n\n  // 6. Otherwise:\n  // 1. Let {fieldName} be the value of the second {Name}.\n  const fieldName = schemaCoordinate.memberName.value;\n  const field = schema.getField(type, fieldName);\n\n  // 2. Return the field of {type} named {fieldName} if it exists.\n  if (field == null) {\n    return;\n  }\n\n  return { kind: 'Field', type, field };\n}\n\n/**\n * ArgumentCoordinate : Name . Name ( Name : )\n *\n * @internal\n */\nfunction resolveArgumentCoordinate(\n  schema: GraphQLSchema,\n  schemaCoordinate: ArgumentCoordinateNode,\n): ResolvedFieldArgument | undefined {\n  // 1. Let {typeName} be the value of the first {Name}.\n  // 2. Let {type} be the type in the {schema} named {typeName}.\n  const typeName = schemaCoordinate.name.value;\n  const type = schema.getType(typeName);\n\n  // 3. Assert: {type} must exist, and be an Object or Interface type.\n  if (type == null) {\n    throw new Error(\n      `Expected ${inspect(typeName)} to be defined as a type in the schema.`,\n    );\n  }\n  if (!isObjectType(type) && !isInterfaceType(type)) {\n    throw new Error(\n      `Expected ${inspect(typeName)} to be an object type or interface type.`,\n    );\n  }\n\n  // 4. Let {fieldName} be the value of the second {Name}.\n  // 5. Let {field} be the field of {type} named {fieldName}.\n  const fieldName = schemaCoordinate.fieldName.value;\n  const field = schema.getField(type, fieldName);\n\n  // 7. Assert: {field} must exist.\n  if (field == null) {\n    throw new Error(\n      `Expected ${inspect(fieldName)} to exist as a field of type ${inspect(typeName)} in the schema.`,\n    );\n  }\n\n  // 7. Let {fieldArgumentName} be the value of the third {Name}.\n  const fieldArgumentName = schemaCoordinate.argumentName.value;\n  const fieldArgument = field.args.find(\n    (arg) => arg.name === fieldArgumentName,\n  );\n\n  // 8. Return the argument of {field} named {fieldArgumentName} if it exists.\n  if (fieldArgument == null) {\n    return;\n  }\n\n  return { kind: 'FieldArgument', type, field, fieldArgument };\n}\n\n/**\n * DirectiveCoordinate : @ Name\n *\n * @internal\n */\nfunction resolveDirectiveCoordinate(\n  schema: GraphQLSchema,\n  schemaCoordinate: DirectiveCoordinateNode,\n): ResolvedDirective | undefined {\n  // 1. Let {directiveName} be the value of {Name}.\n  const directiveName = schemaCoordinate.name.value;\n  const directive = schema.getDirective(directiveName);\n\n  // 2. Return the directive in the {schema} named {directiveName} if it exists.\n  if (!directive) {\n    return;\n  }\n\n  return { kind: 'Directive', directive };\n}\n\n/**\n * DirectiveArgumentCoordinate : @ Name ( Name : )\n *\n * @internal\n */\nfunction resolveDirectiveArgumentCoordinate(\n  schema: GraphQLSchema,\n  schemaCoordinate: DirectiveArgumentCoordinateNode,\n): ResolvedDirectiveArgument | undefined {\n  // 1. Let {directiveName} be the value of the first {Name}.\n  // 2. Let {directive} be the directive in the {schema} named {directiveName}.\n  const directiveName = schemaCoordinate.name.value;\n  const directive = schema.getDirective(directiveName);\n\n  // 3. Assert {directive} must exist.\n  if (!directive) {\n    throw new Error(\n      `Expected ${inspect(directiveName)} to be defined as a directive in the schema.`,\n    );\n  }\n\n  // 4. Let {directiveArgumentName} be the value of the second {Name}.\n  const {\n    argumentName: { value: directiveArgumentName },\n  } = schemaCoordinate;\n  const directiveArgument = directive.args.find(\n    (arg) => arg.name === directiveArgumentName,\n  );\n\n  // 5. Return the argument of {directive} named {directiveArgumentName} if it exists.\n  if (!directiveArgument) {\n    return;\n  }\n\n  return { kind: 'DirectiveArgument', directive, directiveArgument };\n}\n\n/**\n * Resolves schema coordinate from a parsed SchemaCoordinate node.\n * @param schema - GraphQL schema to use.\n * @param schemaCoordinate - The schema coordinate to resolve.\n * @returns The schema element identified by the parsed coordinate, or undefined if none exists.\n * @example\n * ```ts\n * import { parseSchemaCoordinate } from 'graphql/language';\n * import { buildSchema, resolveASTSchemaCoordinate } from 'graphql/utilities';\n *\n * const schema = buildSchema(`\n *   type Query {\n *     greeting(name: String): String\n *   }\n * `);\n * const coordinate = parseSchemaCoordinate('Query.greeting(name:)');\n * const resolved = resolveASTSchemaCoordinate(schema, coordinate);\n *\n * resolved.kind; // => 'FieldArgument'\n * resolved.field.name; // => 'greeting'\n * resolved.fieldArgument.name; // => 'name'\n * ```\n */\nexport function resolveASTSchemaCoordinate(\n  schema: GraphQLSchema,\n  schemaCoordinate: SchemaCoordinateNode,\n): ResolvedSchemaElement | undefined {\n  switch (schemaCoordinate.kind) {\n    case Kind.TYPE_COORDINATE:\n      return resolveTypeCoordinate(schema, schemaCoordinate);\n    case Kind.MEMBER_COORDINATE:\n      return resolveMemberCoordinate(schema, schemaCoordinate);\n    case Kind.ARGUMENT_COORDINATE:\n      return resolveArgumentCoordinate(schema, schemaCoordinate);\n    case Kind.DIRECTIVE_COORDINATE:\n      return resolveDirectiveCoordinate(schema, schemaCoordinate);\n    case Kind.DIRECTIVE_ARGUMENT_COORDINATE:\n      return resolveDirectiveArgumentCoordinate(schema, schemaCoordinate);\n  }\n}\n"]}